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

在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中nextcallback也很容易:

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

如果我将其与async库或典型的Javascriptasynchronous模型进行比较,缺lesscallback将不会提供数据或停止进程。

当下next不被调用时, express做什么来保证控制stream?

Express中间件链中的真正callback实际上不是next ,正如你可能假设的那样,而是res.end() 。 任何被处理的请求都必须在某个时候调用这个函数(直接或者间接的)来说明请求已经被处理了。

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


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

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

如果你的代码确实处理了这个请求,这意味着它发回了一个响应,你不应该next调用。 Express并不关心:内部中间件和路由处理程序存储在一个数组中,而Express则检查每个项目是否可以处理请求。 它传递next函数,以便它可以被告知尝试下一个匹配处理程序。 但它是可选的。

它也用于将错误传递给Express,所以它可以将它们传递给全局error handling程序。 当你看到next(err)被调用时,会发生这种情况。

next在你想把控制权交给next中间件的时候调用。

因为中间件的顺序声明是相关的,所以expression式只会检查你的函数的参数,如果它find第三个参数,那么它会传递一个指向后续中间件的指针。

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