next()在Express

时间:2018-07-23 22:05:27

标签: javascript express middleware

由于Express.js,我目前正在构建一个API,但我仍然不敢相信它有多么神奇。我弄清楚了如何使用中间件,如何处理请求和响应,如何进入下一个中间件……但是有一些事情令我很感兴趣,那就是next()

我知道next()是什么,我只是无法弄清楚next()可以采用什么样的参数,以及它们将做什么。起初我以为是将数据传递给下一个中间件,结果我错了,为此req.locals

有人可以启发我吗?

1 个答案:

答案 0 :(得分:3)

您可以通过三种选择呼叫next()

1。继续路由。。如果您只想继续路由到与该路由匹配的链中的下一个路由处理程序,则只需不使用任何参数即可调用它:

next();

这在中间件中最常使用:

app.use((req, res, next) => {
    // set an item in the session and then continue routing
    req.session.xxx = "foo";
    next();
});

2。

如果您要设置错误并跳过路由到通用错误处理程序,则可以将错误中止路由到集中式错误处理程序。

next(new Error("timeout contacting database"));

然后,它将调用您的常规错误处理路由,并将该特定错误传递给您,您的常规错误处理代码可以在该错误中决定要执行的操作。这使您可以将错误处理响应代码集中在一处。使用next(err)的示例是here

您可以看到the doc for generalized error handling in Express的工作方式示例。

3。跳过此路由器中的路由处理程序,继续在其他路由器中进行路由。如果要跳过当前路由器中的所有路由处理程序,但继续使用可能已注册的任何其他路由,则可以执行以下操作:

next('route');

来自文档:

  

您可以提供行为类似于中间件的多个回调函数,除了这些回调可以调用next('route')来绕过其余的路由回调。您可以使用此机制在路由上施加先决条件,然后在没有理由继续使用当前路由的情况下将控制权传递给后续路由。

如果您反复搜索this page of the doc上的“ next(”),则会发现很多示例。这里有here in the doc的用法示例。


仅供参考,Express 5可能会为next()添加一些新用途,因为它可能会返回一个承诺,让您知道何时完全完成路由。