【问题标题】:control order of express/connect middlewareexpress/connect中间件的控制顺序
【发布时间】:2013-04-12 13:48:30
【问题描述】:

我正在尝试添加身份验证中间件,以防止访问网站的某些部分:

app = express()
    .get('/api/test', function (req, res) { ... })
    .use('/api', function (req, res, next) {
        if (req.param('key')) {
            next();
        } else {
            res.json(401, {
                message : 'Authentication failed'
            });
            res.end();
        }
    })
    .get('/api/data', function (req, res) { ... });

我期望 /api/data 的调用将首先由密钥检查器处理,然后(如果成功)由 /api/data 处理程序处理。而是由'/api/data'首先处理的请求。

检查器似乎适用于 /api/something_that_does_not_exist,但不适用于 /api/something_that_exist。

也许我错过了 express/connect 文档中的某些内容?

更新我已经跟踪到第一个 get/post 调用初始化路由器中间件,因此它首先被执行。

【问题讨论】:

  • 它应该可以工作,并且在我测试它时也可以工作(使用 Express 3.1.1)。
  • 谢谢。代码示例摘自实际代码,缺少重要片段,我在此特定 .use之前添加了一些路由
  • 啊,哎呀,我刚刚注意到你已经发现它是路由器中间件,我也回答了 :) 如果你没问题,我会按原样留下答案,可能会有所帮助将来会有其他人。
  • 我写过一篇关于Express应用中中间件顺序的重要性的文章。这里是文章的链接:nodexplained.com/blog-detail/2018/01/11/…

标签: node.js express connect.js


【解决方案1】:

一旦你声明了一个路由,Express 就会在设置应用程序时将router 中间件插入到中间件堆栈中。

在您的情况下,因为您在插入密钥检查中间件之前插入了 .get('/api/test', ...),所以路由器中间件将被插入并优先(也适用于您稍后声明的 /api/data 路由),并且永远不会调用您的密钥检查器。

这里有两个解决方案:

// separate middleware, used for all routes that need checking
var keyChecker = function(req, res, next) {
  ...
};
app.get('/api/test', function(req, res) { ... });
app.get('/api/data', keyChecker, function(req, res) { ... });

// or, as an alternative, create a 'catch-all' route between the routes that don't
// need to be checked, and the ones that should; this will also match non-existing
// routes (like '/api/foobar'), which might or might not be an issue;
app.get('/api/test', function(req, res) { ... });
app.all('/api/*', function(req, res, next) { // 'all' means 'all methods'
  // keychecker code
});
app.get('/api/data', function(req, res) { ... });

第三种解决方案可能是在密钥检查中间件本身 (req.path === '/api/test') 中显式检查 /api/test,如果匹配,只需调用 next()

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2012-06-08
    • 2013-08-22
    • 2011-07-14
    • 2012-02-21
    • 2013-12-09
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多