为什么在快速路由中调用next()是可选的?

时间:2017-05-29 08:43:31

标签: node.js express callback node-async

在Nodejs / Express的许多例子中,我看到在成功的情况下调用next()是可选的。

exports.postLogin = (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    if (err) {
        return next(err);
    }
    req.logIn(user, (err) => {
      if (err) { return next(err); }
      req.flash('success', { msg: 'Success! You are logged in.' });
      res.redirect(req.session.returnTo || '/');
    });
  })(req, res, next);
};

此外,很容易在args中跳过回调next

exports.postLogin = (req, res) => {
  res.render('some-template', locals);
}

如果我将其与async lib或典型的Javascript异步模型进行比较,则缺少回调将不会提供数据或停止该过程。

express在未调用next时如何处理控制流程?

3 个答案:

答案 0 :(得分:8)

Express中间件链中的真正回调实际上不是next,正如您可能认为的那样,但是res.end()。处理的任何请求必须在某个时候调用此函数(直接或间接)来表示请求已被处理。

当您在middeware中调用next()时,您将负责将res.end()调用到中间件链中间的中间件。如果链中的最后一个中间件调用next(),则Express知道没有中间件已经或将要处理该请求,因此将生成“404 Not Found”页面。

此外,使用单个参数next(err)调用err的工作方式不同,因为它告诉Express发生错误并且它应该立即停止处理请求。

答案 1 :(得分:2)

next用于将请求传递给其他(可能的)处理程序。如果您正在编写中间件或(不太可能)不想处理请求的路由处理程序,请调用next并让Express对其进行排序。也许还有其他中间件或其他路由处理程序可以处理它。

如果您的代码 处理请求,意味着它发回了回复,则您不应该致电next。 Express并不关心这一点:内部,中间件和路由处理程序存储在一个数组中,Express会检查每个项目以查看它是否可以处理请求。它传递next函数,以便可以告诉它尝试下一个匹配的处理程序。但它是可选的。

它还用于将错误传递给Express,因此它可以沿全局错误处理程序传递它们。当您看到next(err)被调用时会发生什么。

答案 2 :(得分:0)

如果要将控件传递给next中间件,则会调用

next

由于中间件的订单声明是相关的,express只会负责验证函数的参数,如果它找到第三个参数,那么它会将指针传递给后续的中间件。

如果将结果返回给客户端(例如,调用res.render),则不需要调用next,因此您不需要next作为第三个参数。