在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),它们是reqresnext

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'的地方。