在Express中,如何在app.get中使用多个回调函数?

17

我是一个Node.js的新手,如果我没有理解明显之处,请原谅我。 在Node.js的Express应用程序中,对于app.get函数,我们通常将路由和视图作为参数传递。 例如:

app.get('/users', user.list);

但在passport-google示例中,我发现他们将其称为:

app.get('/users', ensureAuthenticated, user.list);

ensureAuthenticated 是一个函数

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/login')
}

简而言之,这意味着有多个回调函数,当它们运行时会按顺序依次调用。我尝试添加了几个更多的函数,使其看起来像是

app.get('/users', ensureAuthenticated, dummy1, dummy2, user.list);

我发现ensureAuthenticated、dummy1、dummy2和user.list是按顺序依次调用的。对于我的具体要求,我认为在上述形式中依次调用函数是一种很优雅的解决方案,而不是使用async series。能否有人解释一下它是如何工作的,以及我如何在一般情况下实现类似的功能。


1
https://dev59.com/DW435IYBdhLWcg3wrSBB - bryanmac
1个回答

17

在Express中,路径后面的每个参数都按顺序调用。通常,这是实现中间件的一种方式(正如您所提供的示例中看到的那样)。

app.get('/users', middleware1, middleware2, middleware3, processRequest);

function middleware1(req, res, next){
    // perform middleware function e.g. check if user is authenticated

    next();  // move on to the next middleware

    // or

    next(err);  // trigger error handler, usually to serve error page e.g. 403, 501 etc
}

1
有没有办法将一些数据传递到下一个回调函数中,比如说“sessionAccount”? - Victor
4
@Victor,是的,只需将数据附加到req对象上(req.sessionAccount = ...)即可。 - Jonas Bürkel
@Jonas 非常感谢!在您回答之前,我自己尝试了一下并发现它能正常工作。 - Victor
我如何在中间件函数中传递自定义参数? - Ketav
@KetavChotaliya 这与Victor所问的有何不同(并由Jonas回答)? - takinola

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