一、概念(来自官网)
中间件函数能够访问请求对象 (req
)、响应对象 (res
) 以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next
的变量来表示。
中间件函数可以执行以下任务:
- 执行任何代码。
- 对请求和响应对象进行更改。
- 结束请求/响应循环。
- 调用堆栈中的下一个中间件函数。
如果当前中间件函数没有结束请求/响应循环,那么它必须调用 next()
,以将控制权传递给下一个中间件函数。否则,请求将保持挂起状态。
参考文章:http://expressjs.com/zh-cn/guide/writing-middleware.html
二、自定义中间件
假如要写一个中间件,用户每次访问页面都需要判断他是否有登录,或者还有其他对用户的检验,则可以写一个中间件去处理,
// checkUser.js
module.exports = function () {
return function (req, res, next) {
if (!req.session.uid) {//如果没有uid,则表示还没登录,提示还没登录
res.render('common/hint', { 'content': '您还没登录!', 'url':'http://127.0.0.1:3000/user/login' });
return;
}
// 这里还可以写很多检测用户的逻辑。。。。
next();
}
};
接着在app.js引入该中间件,再使用它即可:
var checkUser= require('./checkUser.js');
app.use(checkUser());
当然要想在路由层级使用它也是一样的
三、错误处理的中间件
1.错误处理中间件函数的定义方式与其他中间件函数基本相同,差别在于错误处理函数有四个自变量而不是三个,专门具有特征符 (err, req, res, next)
app.use((err, req, res, next) => {
let msg = err.toString().replace(/
/g, '</br>');
res.send('errorStatus:' + (err.status || 500) + '</br> Error: ' + msg + '</br>');
res.end();
})
当有错误发生的时候,会跳过所有的普通中间件,但是不会跳过错误处理中间件
2.如何触发错误处理中间件?
方法一:直接用next进行传递
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
方法二:直接throw
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
throw err;
});