在Express.js中的res.send()之后退出
我有一个相当简单的Express.js应用程序,如果login失败,我想早点退出。 我看到有迹象表明,该应用程序没有这样做,我还没有find明确的答案,指出是否调用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
是一个函数,当没有参数调用将触发中间件链中的下一个处理程序。
如果next
一个参数被调用,那么这个参数将被解释为一个错误,而不pipe该参数的types如何。
其签名是next([error])
。 当下一个错误被调用时,不是调用中间件链中的下一个处理程序,而是调用error handling程序。 您应该处理该error handling程序中的401响应代码。 有关Express中error handling的更多信息,请参阅此处
编辑:作为@Baptiste哥斯达黎加评论说,简单地调用next()
将不会停止当前的执行,但它会调用下一个中间件。 最好使用return next()
来防止Node进一步抛出错误(比如can't set headers after they are sent
错误can't set headers after they are sent
)。 这包括上面提到的错误投掷这是常见的:
return next(new Error([error]));
[我的道歉没有发表评论,没有足够的声誉呢]
当然,快递不能奇迹般地让你的JavaScript函数停止从其他地方执行。
我不喜欢下一个([错误])解决scheme,因为我认为错误应该只用于你通常不期望的情况下(比如不可达的数据库或者其他东西)。 在这种情况下,一个简单的错误密码会导致错误。 普通控制stream程不使用exception/错误是一个常见的惯例。
因此,我build议在res.send调用之后放置一个return语句,以使您的函数进一步执行。
client.login( username, password, function( auth, client ) { if( !auth ) { res.send( 401 ); return; } // DO OTHER STUFF REALLY ONLY IF AUTH IS SUCCESSFUL }
为什么没有人build议使用“其他”块?
if(!auth){ // Auth fail code res.send 'Fail' } else { // Auth pass code res.send 'Pass' }
当为app.use(function(req,res,next));“”创build自己的中间件时使用'next'。 如果你已经build立了一个类似“app.get(route,function(req,res))”的路线, 那么函数中的代码就是你可以让你指定的代码而不需要使用'next'的地方。