如何在node.js中的next()后停止功能?

问题描述 投票:2回答:2

好吧,我有这样的代码:

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后停止app.get()()函数?

只是,我发现的方法是调用

return false;

后年(),但这种方法并没有在异步函数的工作(如user.save()),这显然

UPD1:在另一个词,如何避免“还活着”在控制台?

user.save(function(err,c){
    return next(err)
})
console.log('Still alive')
node.js express
2个回答
3
投票

要么你想节点+快递的异步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()与一个错误的说法。当快递看到被称为next(err),它会在发送到全局错误处理程序(如果有),或抛出一个异常,如果你没有定义一个。

请注意,您的代码已被分成三个部分:“中间”检查处理中间件对象,生成应该回来从URL请求的最终数据的路由对象,并有一个中间件路由的app.get步骤,以及一个最终内容生成功能。

用快递的想法是少每步可以做到的。需要验证四个参数?这四个中间件功能,然后称为app.get("someroute", fn1, fn2, fn3, fn4, generatePage),每个中间件功能的调用或者对next()成功,或next(new Error(...});时出事了。


2
投票

就像是在评论中说:

return next(err)

应该解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.