好的,我有这样的代码:
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:换句话说,如何在控制台中避免“还活着”?
user.save(function(err,c){
return next(err)
})
console.log('Still alive')
答案 0 :(得分:3)
您想要node + express的异步next()
行为,或者您需要明确地将其删除:
var middleware = {
auth: function(req, res, next) {
if(req.body.username=='') {
return next({
'type':'error',
'httpCode':400,
'message': {
'errCode': 'e402',
'text': 'Not name specified'
}
});
}
next();
}
}
var routes = {
someurl: function(req, res) {
console.log('all is ok!')
res.send(200, "Ok")
}
}
app.use(function universalErrorHandler(req, res, next, err) {
console.error("oh no something went wrong!");
console.error(err);
});
app.get('/someUrl', middleware.auth, routes.someurl);
这个想法是你做的每一步"步骤"在它自己的功能。应该继续处理?不带错误参数调用next()。处理应该中止吗?使用错误参数调用next()。当express看到next(err)
被调用时,它会将它发送到全局错误处理程序(如果有),或者如果你没有定义一个则抛出异常。
请注意,您的代码分为三个部分:一个用于处理"在中间"的中间件对象。检查,用于生成应从URL请求返回的最终数据的路由对象,以及具有一个中间件步骤的路由的app.get
,以及一个最终内容生成功能。
快递的想法是尽可能少地执行每一步。需要验证四个参数?这是四个中间件函数,然后调用app.get("someroute", fn1, fn2, fn3, fn4, generatePage)
,每个中间件函数在成功时调用next()
,或者在出现错误时调用next(new Error(...});
。
答案 1 :(得分:2)
就像在评论中所说的那样
return next(err)
应该解决你的问题。