express中间件
-中间件概念
-中间件特指业务流程的中间处理环节
-express中间件的格式
//中间件的形参列表中,必须包含next参数,而路由处理函数中只包含req和res app.get('/',(req,res,next)=>{ next() })
-next函数的作用
next函数是实现多个中间件连续调用的关键,他表示把流转关系转交给下一个中间件或路由
-体验express中间件
-定义中间件函数
const mv = (req,res,next)=>{ console.log('this is simple mv most'); //把流转关系,转交个下一个中间件或路由 next() }
-全局生效的中间件
//将mv注册为全局中间件,这样的话任何请求都会先经过mv处理 app.use(mv)
-全局中间件简化形式
app.use((req,res,next)=>{ console.log('this is simple mv most'); //把流转关系,转交个下一个中间件或路由 next() })
-中间件的作用
多个中间件之间,共同一份req和res,这样我们可以在请求刚到服务器时,可以在上游的中间件中,统一为req和res对象添加自定义属性或或方法,给下游的中间件和路由使用
const express = require('express') const app = express() app.use((req,res,next)=>{ const time = Date.now() //为req挂载自定义属性,从而共享给后面的所有路由 req.startTime = time console.log('this is simple mv most'); //把流转关系,转交个下一个中间件或路由 next() }) app.get('/user', (req, res) => { // res.sendStatus(req.startTime) res.send('请求成功'+req.startTime) }) app.post('/user', (req, res) => { res.send('请求成功') }) app.listen(80,()=>{ console.log('server is running'); })
-创建多个中间件
执行顺序按照中间件定义先后顺序执行
app.use((req,res,next)=>{ const time = Date.now() //为req挂载自定义属性,从而共享给后面的所有路由 req.startTime = time console.log('this is simple mv most'); //把流转关系,转交个下一个中间件或路由 next() }) app.use((req,res,next)=>{ console.log('second mv'); next() })
结果.jpg
-局部生效的中间件
不使用app.use()定义 中间件,叫做局部生效的中间件
const express = require('express') const app = express() const m1 = (req,res,next)=>{ console.log('调用了局部生效的中间件'); next() } //调用m1中间件 app.get('/',m1,(req,res)=>{ res.send('index page') }) app.get('/user',(req,res)=>{ res.send('user page') }) app.listen(80,()=>{ console.log('server is running'); })
访问 ‘/’打印结果.jpg
访问‘/user’打印结果.jpg
什么都不打印
-定义多个局部中间件,可以通过如下两种等价的方式,使用多个局部中间件
app.get('/',m1,m2,(req,res)=>{ res.send('index page') }) app.get('/user',[m1,m2],(req,res)=>{ res.send('user page') })
-注意:
一定要在路由之前注册中间件
客户端发过来的请求,可以连续调用多个中间件进行处理
执行完业务代码后,记得调用next()函数
为防止代码逻辑混乱,在next函数执行之后不再写额外的代码
连续调用多个中间件时,多个中间件之间共享req和res对象