在Express.js中的res.send()之后退出

Rob*_*son 41 node.js express

我有一个相当简单的Express.js应用程序,带有登录组件,如果登录失败,我想提前退出.我看到有迹象表明该应用程序没有这样做,我还没有找到一个明确的答案,表明调用是否会res.send()停止任何进一步的处理.这是我现在的代码:

client.login( username, password, function( auth, client ) {
  if( !auth ) {
    res.send( 401 );
  }

  // DO OTHER STUFF IF AUTH IS SUCCESSFUL
}
Run Code Online (Sandbox Code Playgroud)

如果我正确读取源代码,它应该结束请求(中止进一步处理),但我是节点的新手,所以我还没准备好相信我认为我正在阅读的内容.简而言之,我想我主要是从一个更值得信赖的消息来源寻找一个明确的答案,我自己对不熟悉的源代码的解释.如果send()没有中止处理,那么正确的方法是什么?

Ste*_*eer 38

当然快递不能神奇地使你的javascript函数停止从其他地方执行.

我不喜欢下一个([错误])解决方案,因为我认为错误应仅用于您通常不期望的情况(如无法访问的数据库或其他东西).在这种情况下,一个简单的错误密码会导致错误.不对常规控制流使用异常/错误是一种常见的约定.

因此,我建议在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
}
Run Code Online (Sandbox Code Playgroud)

  • 这不只是一个品味问题,它在语义上是不正确的.阅读这段代码你会假设`res.send()`返回一些东西,但它不会返回任何东西.您可以继续假设`client.login()`也返回`res.send()`返回的内容,这也是一个不正确的假设.在你的例子中没关系,但是这将创造一种习惯,它会在它*重要的地方表现出来. (8认同)
  • 怎么样`return res.send(401);`? (6认同)

Flo*_*oby 35

如果您使用express作为框架,则应该调用next().

在表达每个处理程序接收3个参数(unlinke 2为基本HTTP),其是req,resnext

next 是一个函数,当没有参数调用时将触发中间件链中的下一个处理程序.

如果next使用参数调用,则无论该参数的类型如何,此参数都将解释为错误.

它的签名是next([error]).当使用错误调用next时,它不会调用中间件链中的下一个处理程序,而是调用错误处理程序.您应该在该错误处理程序中处理401响应代码.见对于在快速的错误处理的详细信息

编辑:作为@Baptiste科斯塔评论,只是要求next()不会停止当前的执行,但它会调用上的下一个中间件.最好使用它return next()来防止Node进一步抛出错误(例如can't set headers after they are sent- 错误).这包括上面提到的错误抛出的常见问题:

return next(new Error([error]));
Run Code Online (Sandbox Code Playgroud)

[我很抱歉没有在评论中发帖,还没有足够的声誉]

  • 调用next()函数不会中止处理,因此,`// DO OTHER STUFF如果AUTH成功'将被执行... (7认同)

小智 6

对于您的具体情况,您只需添加“else”语句即可:

client.login( username, password, function( auth, client ) {
    if( !auth ) {
        res.send( 401 );
    }else {
       // DO OTHER STUFF IF AUTH IS SUCCESSFUL
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,一般来说,您可以使用“return”:

return res.send( 401 );
Run Code Online (Sandbox Code Playgroud)