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

use*_*749 4 node.js express

好的,我有这样的代码:

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")
    })
})
Run Code Online (Sandbox Code Playgroud)

当我尝试发送空请求时,我的错误处理程序通过 next() 函数向我发送正确的响应。但是在此用户架构尝试保存之后(例外)。如何在调用 next() 后停止 app.get() 函数?

我发现的唯一方法是调用

return false;
Run Code Online (Sandbox Code Playgroud)

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

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

user.save(function(err,c){
    return next(err)
})
console.log('Still alive')
Run Code Online (Sandbox Code Playgroud)

Mik*_*ans 6

要么你想要 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);
Run Code Online (Sandbox Code Playgroud)

这个想法是你在它自己的功能中做每一个“步骤”。是否应该继续处理?调用 next() 没有错误参数。是否应该中止处理?使用错误参数调用 next() 。当 express 看到一个next(err)被调用时,如果有一个,它会将它发送到全局错误处理程序,或者如果您没有定义一个,则抛出异常。

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

express 的想法是每一步尽可能少做。需要验证四个参数?这是四个中间件函数,然后调用 as app.get("someroute", fn1, fn2, fn3, fn4, generatePage),每个中间件函数要么调用next()成功,要么next(new Error(...});在出现问题时调用。


Olu*_*Olu 3

就像评论里说的那样

return next(err)
Run Code Online (Sandbox Code Playgroud)

应该可以解决你的问题。