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

标签 node.js scope express connect middleware

我正在学习 express.js/node.js 并且对 javascript 原型(prototype)模型有很好但不是很好的理解。因此,对于中间件在 express.js 的路由机制中的堆叠方式,我有点困惑。

假设我们有这个 code

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);
});

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

  1. 返回函数中req、res、next参数从何而来?我猜“链”以某种方式对其进行排队并分配参数,但这对于更深入的理解来说有点太模糊了......

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

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

如果有人能指出基本想法,那就太酷了:)

最佳答案

1) reqres来自 Express JS 的源头,即 Node.JS http.createServer处理程序(在实际点击 Express 处理程序之前,这两个变量都进行了一些修改)。此时 Express 持有所有路由的数组并应用 req , resnext作用于每条路线。 next函数知道我们目前在哪个中间件(由于一些范围技巧)并像这样调用它:next()带你到下一个处理程序。

2) 当错误被引发(实际上不是引发,而是传递给)时,next函数将您带到错误处理程序,您可以使用 error 定义它app的方法| ,例如(取自 Express documentation):

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

加注error中断中间件链并将您带到错误处理程序链(如您所见,您也在错误处理程序中使用 next)。

3) 一点都不难:

security.js

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

app.js

app.get('/', require('./security'), ...);

关于node.js - express.js 中的中间件功能范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11272454/

相关文章:

javascript - Electron 的本地存储未在动态创建的元素上保存我的点击事件

node.js - Mongoose findOneAndUpdate 不工作

javascript - 为什么 Handlebars 会更改我们传递给它的数据的范围?

python - 为什么这个类似 python 的 ruby​​ 脚本不起作用?

node.js - Node Express CRUD 应用程序文件夹结构

javascript - 快速错误处理和异步等待

java - AppiumServerHasNotBeenStartedLocallyException : The local appium server has not been started

javascript - 为什么 mongoose 以 ID 作为 Buffer 而不是字符串的对象形式返回对象 ID'?

angularjs - 自定义指令和内置指令之间的优先级

reactjs - 如何在使用 nextjs 框架制作并托管在 heroku 上的 express react 应用程序中最有效地执行 gzip