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

时间:2013-02-05 14:26:23

标签: 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
}

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

7 个答案:

答案 0 :(得分:34)

当然快递不能神奇地让你的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
}

答案 1 :(得分:33)

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

express中的每个处理程序都会收到3个参数(基本http为unlinke 2),reqresnext

next是一个函数,在没有参数的情况下调用时会触发中间件链中的下一个处理程序。

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

它的签名是next([error])。当使用错误调用next时,它不会调用中间件链中的下一个处理程序,而是调用错误处理程序。您应该在该错误处理程序中处理401响应代码。有关Express

中错误处理的更多信息,请参阅this 编辑:正如 @Baptiste Costa 所评论的那样,只需调用next()停止当前执行,但它会调用下一个中间件。最好使用return next()来防止Node进一步抛出错误(例如can't set headers after they are sent - 错误)。这包括上面提到的错误抛出的常见问题:

return next(new Error([error]));

答案 2 :(得分:0)

只需执行以下操作即可停止进一步执行。

function (request, response, next) {
    var path = request.body.path;

    if(path === undefined){
        response.status(HttpStatus.BAD_REQUEST);
        response.send('path is required!');
    }

    next(response)
};

答案 3 :(得分:0)

对于您的特定情况,您只需添加'else'语句:

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

或者,通常,您可以使用“返回”:

return res.send( 401 );

答案 4 :(得分:0)

在这些情况下,我倾向于使用 try...catch 块。

client.login( username, password, function( auth, client ) { 

 try{
   if(error1){
    throw {status : 401 , message : 'error1'}
   }
   if(error2){
    throw {status : 500 , message : 'error2'}
   }
 }catch(error){
   res.status(error.status).json(error.message);
 }

}

答案 5 :(得分:-3)

您只需要退货即可结束流程:

return  res.send( 401 );

这会将401响应发送回去,并且不会在流程中继续前进。

答案 6 :(得分:-6)

为什么没有人建议使用'else'块?

if(!auth){
    // Auth fail code
    res.send 'Fail'
} else {
    // Auth pass code
    res.send 'Pass'
}
为“app.use(function(req,res,next))”创建自己的中间件时使用

'next'。“ 如果你设置了一个像“app.get(route,function(req,res))”的路线;“那么函数中的代码就是你可以拥有你指定的代码的地方,而不需要使用'next'。