持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
“金秋十月,我要连续30天更文,做劳模,拿手机摄影神器!点击查看活动详情 “即可成功参与
中间件
中间件特指业务流程中的中间处理环节
当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理
中间件的格式
Express的中间件,本质上就是一个function处理函数,只不过形参特殊,格式如下:
app.use('/',(req,res,next)=>{
next()
})
这个回调函数就是一个中间件 ,中间件函数的形参中,必须包含next参数,而路由处理函数中只包含req和res
如何区分一个函数到底是路由处理函数还是中间件处理函数,就看next()
next函数的作用
next函数是实现多个中间件连续调用的关键,他表示把流转关系转交给下一个中间件或路由
中间件的作用
多个中间件之间,共享同一份req和res,基于这样的特性,我们可以在上游的中间件中,统一为req或res对象添加自定义的属性或方法,供下游的中间件或路由使用
代码演示:
中间件:
app.use((req,res,next)=>{
req.time=Date.now()//为req这个对象,挂载自定义属性,从而把时间共享给后面的所有路由
next()
})
路由:
app.get('/',(req,res)=>{
res.send(req.time)//可以使用这个自定义属性
})
全局中间件函数
客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫全局中间件
通过app.use(中间件函数),即可定义一个全局生效的中间件
app.use((req,res,next)=>{
console.log("我是一个全局中间件")
next()
})
定义多个全局中间件
可使用app.use()连续定义多个全局中间件,客户端请求到达服务器之后,会按照中间件定义的先后顺序依次执行调用
app.use((req,res,next)=>{//定义第1个全局中间件
console.log("我是第一个全局中间件")
next()
})
app.use((req,res,next)=>{//定义第2个全局中间件
console.log("我是第二个全局中间件")
next()
})
app.use((req,res,next)=>{////定义第3个全局中间件
console.log("我是第三个全局中间件")
next()
})
...
路由:当客户发发起请求时,先会依次触发上面的全局中间件,最后再执行路由
app.get('/',(req,res)=>{
res.send("hahha")//这个路由,会依次触发上面的全局中间件
})
局部中间件
不使用app.use()定义的中间件,叫做局部生效的中间件
function fn(req,res,next){
console.loh("我是局部中间件函数")
next()
}
当用户请求的是/这个地址时,这个中间件才会生效
app.get('/',fn,(req,res)=>{//fn这个中间件,只在这个路由中生效,这种用法属于“局部生效的中间件”
res.send("hahha")
})
app.get('/user',(req,res)=>{//上面的fn这个中间件,不会影响到这个路由
res.send("hahha")
})
定义多个局部中间件
可以再路由中, 如果下面两种方式,使用多个局部中间件
app.get('/',fn1,fn2...,(req,res)=>{ res.send("hahha")})
app.get('/',[fn1,fn2,...],(req,res)=>{ res.send("hahha")})
中间件的5个注意事项
- 一定要在路由之前注册中间件
- 客户端发送过来的请求,可以连续调用多个中间件进行处理
- 执行完中间件的业务代码之后,不要忘记调用next()函数
- 为了防止代码逻辑的混乱,调用next()函数之后不要再写额外的代码
- 连续调用多个中间件时,多个中间件之间,共享req和res对象