在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
时如何处理控制流程?
答案 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
。
如果将结果返回给客户端(例如,调用res.render
),则不需要调用next,因此您不需要next作为第三个参数。