我有一个相当简单的Express.js应用程序,其中包含登录组件,如果登录失败,我想提前退出。我看到有迹象表明该应用程序没有这样做,我没有找到明确的答案,表明调用res.send()
是否会停止任何进一步的处理。这是我现在的代码:
client.login( username, password, function( auth, client ) {
if( !auth ) {
res.send( 401 );
}
// DO OTHER STUFF IF AUTH IS SUCCESSFUL
}
如果我正确阅读了源代码,应该结束请求(中止进一步处理),但我是节点的新手,所以我还没准备好相信我的想法正在读书。简而言之,我想我主要是从一个更值得信赖的消息来源寻找一个明确的答案,我自己对不熟悉的源代码的解释。如果send()
没有中止处理,那么正确的方法是什么?
答案 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),req
,res
和next
next
是一个函数,在没有参数的情况下调用时会触发中间件链中的下一个处理程序。
如果使用参数调用next
,则无论该参数的类型如何,此参数都将解释为错误。
它的签名是next([error])
。当使用错误调用next时,它不会调用中间件链中的下一个处理程序,而是调用错误处理程序。您应该在该错误处理程序中处理401响应代码。有关Express
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'。