【问题标题】:Why is node.js/bluebird eating an exception?为什么 node.js/bluebird 吃异常?
【发布时间】:2015-11-08 22:29:31
【问题描述】:

在我的承诺堆栈深处,我做了这个调用:

function isNameAvailable(name) {
    return registry.getName(name)
        .then(function(result) {
            return result ? false : true;
        });
}

很遗憾,这是一个编程错误,注册表未定义。我的 node.js 应用程序没有打印任何错误消息。任何想法为什么?我正在使用 bluebird promise 库。

编辑

这是调用代码。我刚刚添加了捕获,但它没有捕获任何内容。

function _checkAvailability(name) {
    return isNameAvailable(name)
        .then(function(isAvailabile) {
            if (isAvailabile) {
                return true;
            }
            else {
                throw new NameNotAvailable('Name "' + name + '" is not available');
            }
        })
        .catch(function(error) {
            console.log('isNameAvailable threw', error);
            throw error;
        })
}

堆栈最终应该回滚到 express.js 作为 HTTP 请求的结果调用的函数。这是我捕获所有错误并打印堆栈跟踪的地方(但显然它没有打印任何内容):

function createUser(req, res) {
    userService.createUser(req.body)
        .then(function(user) {
            res.status(201).send(user);
        })
        .catch(function(error) {
            log.trace(error);
            res.status(500).send({'message': error.toString()});
        });
}

【问题讨论】:

  • 你在哪里打电话给isNameAvailable?它确实抛出了。
  • 你能分享更多你的代码吗?据此,我猜问题在于您没有发现错误。
  • 请查看我对此代码调用者的编辑。
  • isNameAvailable 同步执行 throw 异常。这不会在返回值的任何.catch() 处理程序中被捕获,因为您没有返回被拒绝的承诺——catch 方法永远不会执行。如果您正在执行类似somePromise.then(isNameAvailable)(或.then(_checkAvailability))之类的操作,该错误将被捕获并转化为拒绝
  • 好的,有道理。所以基本问题是isNameAvailable 由于编程错误 没有返回承诺,所以我们不能指望thencatch 工作。看来我根本不应该更改代码,而只是确保我能够调试此类问题。

标签: javascript node.js bluebird


【解决方案1】:

已编辑以反映您的更新:

Naresh 是对的,如果它抛出,你需要从 is name available 返回一个被拒绝的承诺。你可以试试

  function isNameAvailable(name) {
    try {
      return registry.getName(name)
        .then(function(result) {
          return result ? false : true;
        });
    } catch(e){
      return Promise.reject(e)
    }
  }

查看这篇文章,了解深度承诺中的错误。

http://www.mattgreer.org/articles/promises-in-wicked-detail/#promises-can-swallow-errors-

【讨论】:

    猜你喜欢
    • 2010-10-19
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多