Express Post功能中回调的执行顺序

时间:2014-10-02 14:07:00

标签: javascript node.js express callback

我遇到[快递的路线处理方法],特别是邮政功能 (http://expressjs.com/api.html#app.VERB

我正在尝试解析this passport example

中的一段代码
app.post('/login', 
  passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }),
  function(req, res) {
  res.redirect('/');
});

快递文件说

  

给出了多个回调,所有回调都被平等对待,行为就像中间件一样。

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

  

中间件就像是一堆连在一起的管子。首先出现的中间件是首先列出的中间件。如果数据是水,它将流经首先列出的管道。

     

对于路由处理方法中的回调也是如此:回调是链接在一起的管道,如果您通过这些“管道”倾注数据,您将通过列出的第一个回调,然后按顺序进行第二次回调。这是真的吗?

作为后续问题,这些回调应该归还什么?第一个回调是否返回响应,第二个回调接收并视为请求?什么应该从管道出来,我可以把它粘在第二个管道?

1 个答案:

答案 0 :(得分:2)

在这种情况下回调的回归并不重要。他们正在调用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,因此您的中间件会被控制。

您甚至可能希望不将控件传递给其他中间件,基于给定条件(几乎是护照所做的),就像这样。

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

如果放在任何其他中间件之前的上述功能会阻止不包含秘密的请求继续!