为什么在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中next
callback也很容易:
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作为第三个参数。