【问题标题】:How to stop function after next() in node.js?如何在 node.js 中的 next() 之后停止功能?
【发布时间】: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.logres.send 都不会运行。
  • 您实际上并没有尝试返回值。这只是停止执行的最简单方法。这与if (err){ next(err); } else { /** other code **/ } 大致相同,只是更好一点。

标签: node.js express


【解决方案1】:

要么你想要 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 请求返​​回的最终数据的路由对象以及用于具有一个中间件步骤和一个最终内容生成函数的路由。

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

【讨论】:

    【解决方案2】:

    就像在 cmets 中所说的那样

    return next(err)
    

    应该可以解决你的问题。

    【讨论】:

      猜你喜欢
      • 2021-02-08
      • 2019-05-16
      • 2012-08-10
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多