一.中间件 middleware
1.中间件作用
一个请求发送到服务器后,他的生命周期是:
- 收到request(请求)
- 服务端处理
- 发送response(响应)
如果业务逻辑复杂,为了明确和便于维护,需要把处理的事情分配成几个部分来做,而每个部分就是一个中间件(在实际请求发生之前hack req和res对象来实现一些功能)
2.中间件是什么
中间件其是一个函数,在响应发送之前对请求进行一些操作
function middleware(req,res,next){
// 做该干的事
// 做完后调用下一个函数
next();
}
next也是一个函数,它表示函数数组中的下一个函数
函数数组
express内部维护一个函数数组,这个函数数组表示在发出响应之前要执行的所有函数,也就是中间件数组
使用app.use(fn)后,传进来的fn就会被扔到这个数组里,执行完毕后调用next()方法执行函数数组里的下一个函数,如果没有调用next()的话,就不会调用下一个函数了,也就是说调用就会被终止
3.实现简单express
function express(){
var funs = [] //等待执行的函数组
var app = function (req,res){
var i = 0;
function next(){
var task = funcs[i++]
if(!task){
return
}
task(req,res,next)
}
next()
}
app.use = function (task) {
funcs.push(task);
}
return app;
}
4.使用中间件
4.1 挂载路由
app.use(route);
4.2 验证token
//token处理
//解析token获取用户信息
app.use(function (req, res, next) {
var token = req.headers['authorization'];
if (token == undefined) {
return next();
} else {
vertoken.getToken(token).then((data) => {
req.data = data;
return next();
}).catch((error) => {
return next();
})
}
});
//验证token是否过期并规定那些路由不需要验证
app.use(expressJwt({
secret: 'zgs_first_token',
algorithms: ['HS256']
}).unless({
path: ['/login', '/register'] //不需要验证的接口名称
}))
//token失效返回信息
app.use(function (err, req, res, next) {
if (err.status == 401) {
return res.status(401).json({ message: 'token失效' })
}
})
4.3 设置静态目录
app.use(express.static(path.join(__dirname, 'public')));
4.4 处理异常
app.use((err,req,res,next)=>{
res.status(200).send("========="+err.stack);
});
4.5 第三方中间件