express.js中的中间件功能范围

shr*_*ing 9 scope middleware connect node.js express

我正在学习express.js/node.js,对javascript原型模型有一个很好但不是很好的理解.因此,我对在express.js的路由机制中堆叠中间件的方式感到有点困惑.

假设我们有这个代码

function andRestrictTo(role) {
    return function(req, res, next) {
       req.authenticatedUser.role == role
           ? next() : next(new Error('Unauthorized'));
   }
}

app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){
    res.send('Deleted user ' + req.user.name);
});
Run Code Online (Sandbox Code Playgroud)

由于andRestrictTo(role)返回一个中间件,它在路由链中执行 - 我得到了.然而:

  1. req,res,next参数在返回的函数中来自哪里?我猜这个"链"以某种方式排队并对参数进行排序,但这对于更深入的理解来说有点过于模糊......

  2. 作为next参数引发的Error会发生什么?错误是否会破坏中间件链?

  3. 如果我想将限制机制打包到一个单独的文件/模块(如安全框架),那该怎么办呢?

如果有人可以指出基本的想法,这将是很酷的:)

fre*_*ish 9

1)reqres来自快速JS,即Node.js的的源头http.createServer处理程序(这两个变量被修改实际上是打快处理程序之前一点).此时Express保存所有路由的数组并应用req,res并对next每条路径起作用.next函数知道我们目前在哪个中间件(由于一些作用域技巧)并像这样调用它:next()带你到下一个处理程序.

2)当引发错误(实际上没有引发但传递给)时,该next函数会将您带到错误处理程序,您可以使用该error方法定义错误处理程序app(例如,从Express文档中获取):

app.error(function(err, req, res, next){
    if (err instanceof NotFound) {
        res.render('404.jade');
    } else {
        next(err);
    }
});
Run Code Online (Sandbox Code Playgroud)

提升error打破了一系列中间件并带您进入错误处理程序链(正如您所看到的,您也可以使用next错误处理程序).

3)一点都不困难:

security.js

module.exports = function(req, res, next) {
    console.log('Security middleware!');
    next();
}
Run Code Online (Sandbox Code Playgroud)

app.js

app.get('/', require('./security'), ...);
Run Code Online (Sandbox Code Playgroud)