我有一个相当简单的Express.js应用程序与一个登录组件,我想早点退出登录失败。我看到应用程序没有这样做,我没有找到一个明确的答案,表明调用res.send()是否停止任何进一步的处理。这是我现在的代码:
client.login( username,password,function( auth,client ) { if( !auth ) { res.send( 401 ); } // DO OTHER STUFF IF AUTH IS SUCCESSFUL }
如果我正确地读取源代码,它应该结束请求(中止进一步的处理),但是我是新的节点,所以我还没有准备好相信我正在阅读的内容。要煮掉它,我想我主要是从一个更可靠的来源寻找一个确定的答案,我自己的解释不熟悉的源代码。如果send()不会中止处理,那么正确的方法是什么?
解决方法
如果您使用express作为框架,则应该调用next()。
express中的每个处理程序都接收3个参数(基本http的unlinke 2),这些参数是req,res和next
接下来是一个函数,当没有参数调用时,它将触发中间件链中的下一个处理程序。
如果使用参数调用next,则此参数将作为错误解释,而不管该参数的类型如何。
其签名是下一个([错误])。当下一个被调用时出现错误,而不是调用中间件链中的下一个处理程序,它调用错误处理程序。您应该处理该错误处理程序中的401响应代码。有关Express中错误处理的更多信息,请参阅this
编辑:@Baptiste Costa评论说,只需调用next()就不会停止当前的执行,但是它会调用下一个中间件。好的做法是使用return next()来防止Node进一步抛出错误(比如发送错误后不能设置头文件)。这包括上述错误抛出的建议,这是常见的:
return next(new Error([error]));
[我的道歉不发表评论,还没有足够的声誉]