Express中间件的调用流程
当一个请求到达Express的处理器后,可以连续调用多个中间件,对请求进行预处理
Express中间件的格式
Express的中间件,本质上就是一个function
处理函数,格式如下:
const mw = function(req, res, next) {
// next() 函数的作用: 它是中间件连续调用的桥梁,它表示把流转关系转交给下一个中间件或路由
next()
}
全局生效的中间件
客户端发起的任何请求,到达服务器后,都会触发的中间件,叫做全局的中间件。通过调用app.use(中间件函数)
即可定义一个全局生效的中间件函数,可以使用app.use()
定义多个中间件,执行顺序按照定义顺序来调用
/*按照顺序执行,先执行中间件一在执行中间件二*/
// 写法一
app.use(function(req, res, next){
console.log('哈哈哈,我是中间件一')
next()
})
// 写法二
const mw = function(req, res, next){
console.log('哈哈哈,我是中间件二')
next()
}
app.use(mw)
中间件的作用
多个中间件之间,共享一份req和res
。基于这样的特性,我们可以在上游的中间件中统一为req
或者res
添加自定义的属性或方法,供下游的中间件或者路由使用
实例:
const express = require('express')
const app = express()
app.use(function(req, res, next){
req.testcode = '001'
next()
})
app.get('/user/list', (req, res) => {
console.log(req.testcode) // '001'
res.send('我是get请求')
})
app.listen(8085, () => {
console.log('服务器运行起来了')
})
局部生效的中间件
不使用app.use()定义的中间件,叫做局部中间件
const mw1 = function(req, res, next){
console.log('我是局部中间件1')
next()
}
const mw2 = function(req, res, next){
console.log('我是局部中间件2')
next()
}
// 一个中间件
app.get('/test1', mw1, (req, res) => {
res.send('这是测试代码')
})
// 多个中间件
app.get('/test2', mw1, mw2, (req, res) => {
res.send('这是测试代码')
})
// 或者
app.get('/test3', [mw1, mw2], (req, res) => {
res.send('这是测试代码')
})
了解中间件的5个注意事项
①一定要在路由之前
注册中间件
②客户端发送过来的请求,可以连续调用多个中间件
进行处理
③执行中间件的业务代码后,不要忘记调用next()函数
④为了防止代码逻辑混乱,调用next()函数后不要写额外的代码
⑤连续调用多个中间件时,多个中间件之间,共享
req和res对象