Nodejs之Express中间件的分类介绍
中间件的分类
为了方便大家理解和记忆中间件的使用,Express官方把常见的中间件用法,分成了5大类
分别是
- 应用级别的中间件
- 路由级别的中间件
- 错误级别的中间件
- Express内置的中间件
- 第三方的中间件
1 应用级别的中间件
通过app.use()或app.get()或app.post(),绑定到app实例上的中间件,叫做应用级别的中间件,代码示例如下:
只要是直接通过app.xxx调用的,都可以理解为是应用级别的中间件
// 应用级别的中间件(全局中间件)
app.use((req, res, next) => {
console.log("这是中间件函数")
next()
})
// 应用级别的中间件(局部中间件)
app.get("/user", mw, (req, res) => {
res.send('success')
})
2 路由级别的中间件
绑定到express.Router()实例上的中间件,叫做路由级别的中间件。
它的用法和应用级别中间件没有任何区别。
只不过,应用级别中间件是绑定到app实例上,路由级别中间件绑定到router实例上,代码示例如下:
const express = require("express")
const router = express.Router()
// 路由级别的中间件
router.use((req, res, next) => {
console.log("Time: ", Date.now())
next()
})
module.exports = router
3 错误级别的中间件
错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题。
格式:错误级别中间件的function处理函数中,必须有4个形参,形参顺序从前到后,分别是(err, req, res, next)。
// 路由
app.get("/user", (req, res) => {
throw new Error("服务器内部发生了错误!")
res.send("Home Page")
})
// 错误级别的中间件,捕获整个项目的异常错误
app.use((err, req, res, next) => {
console.log("Error: " + err.message)
res.send("Error: " + err.message)
})
错误级别的中间件,必须注册在所有路由之后,如果放在前面会导致在该中间件之后的错误无法被捕获
4 Express内置的中间件
自Express4.16.0版本开始,Express内置了3个常用的中间件,极大的提高了Express项目的开发效率和体验:
express.static
快速托管静态资源的内置中间件,例如:HTML文件、图片、CSS样式等(无兼容性)express.json
解析SON格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)express.urlencoded
解析URL-encoded格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
// 配置解析 application/json 格式数据的内置中间件
app.use(express.json())
// 配置解析 application/x-www-form-urlencoded 格式数据的内置中间件
app.use(express.urlencoded({ extended: false }))
app.post('/user', (req, res)=>{
// 在服务器, 可以使用 req.body 这个属性,来接受客户端端发过来的请求体数据
// 在默认情况下,如果把配置解析表单数据的中间价, 则 req.body 默认等于 undefined
console.log(req.body)
res.send('ok')
})
除了错误级别的中间件,其他的中间件,必须在路由之前进行配置
5 第三方中间件
非Express官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。在项目中,大家可以按需下载并配置第三方中间件,从而提高项目的开发效率。
例如:在express@4.16.0之前的版本中,经常使用body-parser这个第三方中间件,来解析请求体数据。
使用步骤如下:
- 运行npm install body-parser安装中间件
- 使用require导入中间件
- 调用app.use()注册并使用中间件
Express内置的express…urlencoded中间件,就是基于body~parser这个第三方中间件进一步封装出来的。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341