本文介绍了什么是中间件,中间件的构造、使用,以及几种特殊的中间件。
看完后可以对Express中间件有全面深入的了解⭐
一、什么是中间件
中间件是服务器端处理客户端请求的函数。
英文middleware,“中间”表示它作用位置是在请求的预处理部分,“件”,类似于软件的件,有处理功能的函数
本质:处理res,req的函数
工作时机:请求到达后,路由之前(代码从上到下执行,所以中间件也要写在路由之前)
![](https://i-blog.csdnimg.cn/blog_migrate/9a58ac48e29772c620a570f50dbd06c4.png#pic_center)
一个比喻:
处理客户端请求的过程中,请求和影响对象(req和res)是流水,中间件是处理流水的一个个加工厂,对req和res的属性和方法进行增删改查操作,之后再给下个工厂,最后交到路由里面,进行针对性的处理并返回响应。
二、中间件构造
中间件有入有出
入口:三个输入参数是固定的:req, res, next
出口:next();// 该语句为出口表示传递给下一个中间件或者路由
const middleware1 = (req, res, next) => {
// 读取req传来的一些信息
const q = req.query;
//为res添加一些属性,带给之后的处理函数
res.q = q;
// 传递给下一个处理函数
next()
}
三、中间件使用
1、全局注册
出镜率极高的全局注册函数:app.use()
app.use(middleware1);
注册之后,所有的请求都会执行
2、局部使用
写在要使用该中间件的路由前面,可以写多个
const router = express.Router();
router.get( '/',[ mv1, mv2 ], funcA);
四、特殊中间件
1、错误中间件
专门处理路由函数中出现的错误,是唯一写在路由后面的中间件,函数比较固定,一般全局注册
app.get('/', (req, res) => {
throw new error ('出错了');
res.send('这句不会被返回');
})
app.use((err, req, res, next) => {
console.log('捕获错误', err.message);
res.send('出现错误'+err.message);
})
2、内置中间件
三种:express.json()以及express.urlencoded()需要express版本在4.10.0以上
//挂载静态资源
app.use(express.static('./files'))
//将post请求json格式的body信息变为对象格式,下游通过res.body读取
app.use(express.json())
//将post请求编码的body信息解码,下游通过res.body读取
app.use(express.urlencoded({extended: false}));
3、第三方中间件
const mwp = require('三方中间件');
app.use(mvp)
4、自定义中间件
自己写个模块,构建个函数,暴露出去。要用的文件引入,注册用起来
const mv = (req, res, next) => {
// do sth
next();
}
module.expports = mv;