【发布时间】:2014-08-08 15:06:04
【问题描述】:
好的,我有这样的代码:
app.get('/someUrl', function(req, res, next){
if(req.body.username==''){
next({'type':'error', 'httpCode':400, 'message': {'errCode': 'e402', 'text': 'Not name specified'}})
}
var user=new User({'name':'Jack Leeeee'})
user.save(function(err, affected) {
if (err) next({'type': 'error', 'httpCode': 400, 'message': {'errCode': 'e403', 'text': 'Bad error :('}})
console.log('all is ok!')
res.send(200, "Ok")
})
})
当我尝试发送空请求时,我的错误处理程序会通过 next() 函数向我发送正确的响应。但是在这个用户模式试图保存之后(这会产生异常)。调用 next() 后如何停止 app.get() 函数?
我找到的唯一方法是调用
return false;
在next()之后,但是这个方法在异步函数中不起作用(比如user.save()),显然是
UPD1:换句话说,如何避免控制台中的“Still alive”?
user.save(function(err,c){
return next(err)
})
console.log('Still alive')
【问题讨论】:
-
我看到的常用模式是函数最顶部的
if (err) return next(err);。所以你回归的直觉是正确的。你能解释一下为什么这种方法不适合你吗? -
在异步函数中,你只能从回调中返回,这实际上是另一个函数并且不知道调用它的函数:user.save(function(err,c){ return next(err )}) 从匿名函数返回
-
return将停止在函数中执行之后的所有代码。这意味着console.log或res.send都不会运行。 -
您实际上并没有尝试返回值。这只是停止执行的最简单方法。这与
if (err){ next(err); } else { /** other code **/ }大致相同,只是更好一点。