node.js-为Express中的特定路由链接多个中间件

我只想验证一下内容,但无法在Express文档或在线文档中找到与此相关的内容(尽管我知道这是一个功能)。

我可以对其进行测试,但我实际上并没有一个很好的模板,希望听到社区的意见。

如果我这样定义快递路线:

app.get('/', function (req, res) {
  res.send('GET request to homepage');
});

我还可以定义一个中间件并直接加载它,例如

middleware = function(req, res){
  res.send('GET request to homepage');
});

app.get('/', middleware)

但是,我也可以链接这些路由中的至少一个来运行额外的中间件,例如身份验证,如下所示:

app.get('/', middleware, function (req, res) {
  res.send('GET request to homepage');
});

这些是无限连锁的吗? 如果愿意,可以在给定的路由上添加10个中间件功能吗? 我想查看app.get可以接受的参数,但是如前所述,我在文档中找不到它。

Antoine asked 2020-02-29T09:12:49Z
2个解决方案
76 votes

考虑以下示例:

var middleware = {
    requireAuthentication: function(req, res, next) {
        console.log('private route list!');
        next();
    },
    logger: function(req, res, next) {
       console.log('Original request hit : '+req.originalUrl);
       next();
    }
}

现在,您可以使用以下代码添加多个中间件:

app.get('/', [middleware.requireAuthentication, middleware.logger], function(req, res) {
    res.send('Hello!');
});

因此,从上面的代码中,您可以看到“ requireAuthentication”和“ logger”是添加的两个不同的中间件。

Ankur Soni answered 2020-02-29T09:13:54Z
39 votes

这并不是说“无限”,而是说您可以在此处添加多个中间件功能(在文档中称为“回调”):

router.METHOD(path,[callback,...]回调)

...

您可以提供多个回调,并且所有回调都被同等对待,并且其行为与中间件相同,只是这些回调可以调用next('route')绕过其余的路由回调。 您可以使用此机制在路由上执行前提条件,然后在没有理由继续进行匹配的路由时将控制权传递给后续路由。

如您所见,中间件功能和通常处理请求的功能(通常是添加到列表中的最后一个功能)之间没有区别。

拥有10个不是问题(如果您确实需要)。

robertklep answered 2020-02-29T09:13:25Z
translate from https://stackoverflow.com:/questions/31928417/chaining-multiple-pieces-of-middleware-for-specific-route-in-expressjs