Express Post函数中回调的执行顺序是什么?

4

我在使用[Express的路由处理方法]时遇到了麻烦,特别是在Post函数中。
(http://expressjs.com/api.html#app.VERB)

我正在尝试解析这个护照例子中的一段代码。

app.post('/login', 
  passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }),
  function(req, res) {
  res.redirect('/');
});

Express文档中提到:

如果有多个回调函数,所有的回调函数都被平等对待,就像中间件一样。

我的问题是,以下陈述是否准确:

中间件就像一堆管道相互连接。出现在最前面的中间件也是按照列表顺序排列的中间件。如果数据是水,它会通过第一个列表中的管道流动。

对于路由处理方法中的回调也是一样的:回调之间是通过管道相互连接的,如果你把数据“倒”进这些“管道”,数据会先经过列表中的第一个回调再经过第二个回调。这个说法正确吗?

作为后续问题,这些回调函数应该返回什么?第一个回调函数返回响应,第二个回调函数会将其作为请求接收并处理吗?管道里应该输出什么内容?我可以将它放进第二个管道里吗?

1个回答

3

在这种情况下,回调函数返回的内容并不重要。它们会调用next函数(在这个特定的护照示例中未定义的第三个参数)。当调用next函数时,序列中的下一个中间件将以与第一个相同的参数(相同的req,相同的res)被调用。

假设您有以下代码:

function myFirstMiddleware(req, res, next) {//note the third parameter
    //you can change req and res objects
    next();
}

function secondMiddlewareInTheSequence(req, res, next) {
    //here you get the changes you've done to req and res since they are
    //the same objects
    res.end();
}

app.post('/', myFirstMiddleware, secondMiddlewareInTheSequence);

passport.authenticate在内部调用next,如果您的请求已经得到了正确的认证,则会将控制权传递给您的中间件。

甚至可以根据特定条件(与passport非常相似)决定是否将控制权传递给其他中间件,如下所示。

function checkSecret(req, res, next) {
    if(req.query && req.query.secret === '42') {
        console.log('you are allowed to pass!');
        next();
    } else {
        console.log('you shall not pass!');
        res.status(403).end();
    }
}

如果将上述函数放在任何其他中间件之前,它将阻止不包含密钥的请求继续进行!

1
非常清晰的解释!所以基本上是同一个请求和响应对象,被不同的中间件依次调整。太好了!我对正在发生的事情有一个很好的心理模型! - Tara Roys
如果你想深入了解,请查看passport源代码中的authenticate - Renato Gama
谢谢你的提示!哇...这对我来说有点深奥。 - Tara Roys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接