next()在node.js中如何停止函数?

好的,我有这样的代码:

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") }) }) 

当我尝试发送空请求时,我的error handling程序通过next()函数向我发送正确的响应。 但是在这个用户模式试图保存(这使得exception)之后。 如何在调用next()之后停止app.get()函数?

唯一的办法,我发现是电话

 return false; 

在next()之后,但是这个方法在asynchronous函数(如user.save())中不起作用,很明显

UPD1:换句话说,如何避免在控制台中“仍然活着”?

 user.save(function(err,c){ return next(err) }) console.log('Still alive') 

就像在评论中说的那样

 return next(err) 

应该解决你的问题。

要么你想要node + express的asynchronousnext()行为,或者你需要明确地closures它:

 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); 

这个想法是你在自己的function上做的每一步。 应继续加工吗? 调用next()而没有错误参数。 应该加工中止? 使用错误参数调用next()。 当express看到next(err)被调用时,它会将它发送到全局error handling程序中,如果没有定义它,就会抛出exception。

请注意,您的代码已分为三部分:用于处理“中间”检查的中间件对象,用于生成应从URL请求返回的最终数据的路由对象,以及用于路由的app.get一个中间件步骤和一个最终内容生成function。

快递的想法是尽可能less的每一步。 需要validation四个参数? 这是四个中间件函数,然后调用app.get("someroute", fn1, fn2, fn3, fn4, generatePage) ,每个中间件函数调用next()成功,或者next(new Error(...});什么时候出错了。