express中间件的理解

一、概念(来自官网

中间件函数能够访问请求对象 (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(/\n/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;
});

 

posted @ 2017-07-17 15:58  25洁如  阅读(1067)  评论(0编辑  收藏  举报