一、中间件的概念和格式
1、什么是中间件
中间件是指业务处理过程中的中间处理环节,必须有输入与输出。
2、处理流程
当一个请求到达服务器之后,可以调用多个中间件,从而对这次请求做预处理。
3、Express中间件的格式
Express的中间件,本质上就是一个 function 处理函数,官网上 Express 中间件的格式如下:
和路由处理函数的区别就是,中间件必须包含 next
形参。而路由处理函数中只包含 req 和 res.
4、next 函数的作用
next 函数是多个中间件连续调用
的关键,他表示把流转关系转交
给下一个中间件或路由。
二、全局生效的中间件
客户端发起的任何请求
,到达服务器之后,都会触发的中间件,就叫全局生效的中间件。
通过app.use即可定义一个全局生效的中间件
。
多个中间件之间,共享同一份 req
和 res
。基于这样的特性,我们可以在上游的中间件中,统一为 req 或 res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。
const express = require('express')
const app = express()
// 这是定义全局中间件的简化形式
app.use((req, res, next) => {
// 获取到请求到达服务器的时间
const time = Date.now()
// 为 req 对象,挂载自定义属性,从而把时间共享给后面的所有路由
req.startTime = time // 就不用下面路由函数里面每个都写一行这个代码了
next()
})
app.get('/', (req, res) => {
res.send('Home page.' + req.startTime)
})
app.get('/user', (req, res) => {
res.send('User page.' + req.startTime)
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
三、局部生效的中间件
1、不使用 app.use()
定义的中间件,叫做局部生效的中间件。
浏览器访问 http://localhost/,在 (vscode) 终端可以看到:
但是在 postman 访问 http://localhost/user ,就不会执行 mw1 中间件函数。这就是局部中间件。
2、定义多个
局部中间件
前一个中间件函数的结果传给后一个中间件,最后把请求结果交给路由函数处理。
四、中间件的注意事项
- 一定要在
路由之前
注册中间件; - 客户端发送过来的请求,
可以连续调用多个
中间件进行处理; - 执行完中间件的业务代码之后,
不要忘记调用 next() 函数
- 为了防止代码逻辑混乱,
调用 next() 函数后不要再写额外的代码
- 连续调用多个中间件时,多个中间件之间,
共享
req 和 res 对象