Node.js - 在 ES6 promise 链中抛出异常

标签 node.js error-handling es6-promise throw

作为我正在开发的 Node.js/Express API 的一部分,我构建了一个自定义错误处理程序,可以让我在需要时抛出特定错误,例如BadRequest 或 NotFound 等

当我想在一个 promise 链中抛出时,问题就出现了。例如:

db.doSomethingAsync().then(data => {

    if(data.length === 0){
        throw new errors.ResourceNotFound({ resource: "foo" });
    }
});

在大量阅读该主题后,我发现此错误将被 promise 吞没,因此导致未处理的 promise 拒绝。

我知道我可以拒绝,但我不确定如何处理特定错误(而不是我不想要的拒绝的包罗万象)。

此外,要拒绝,我是否不需要在我的 promise 链中创建一个新的 promise ?感觉很乱。

谁能建议如何处理在 promise 链中抛出特定异常?

最佳答案

除了对 then() 的第一个回调(解析回调并接收数据)之外,您还可以向其提供第二个回调,即拒绝回调并接收错误。所以你可以在下一个 then 的第二个回调中捕获这个特定错误:

db
  .doSomethingAsync()
  .then(data => {
    if(data.length === 0){
        throw new errors.ResourceNotFound({ resource: "foo" });
    }
  })
  .then(massagedData => {
    // work with massagedData here
  }, err => {
    // handle err here which is previous thrown error
    // assert.ok( err instanceof errors.ResourceNotFound() )
  })
  .catch(err => {
    // this will catch unhandled errors if any
  });

then() 默认返回一个 promise ,如果它的任何回调(无论是第一个还是第二个)抛出错误,那么它返回一个被拒绝的 promise ,其原因将被下一个拒绝捕获回调(如果有)或最后捕获。所以你不需要创建一个新的 promise 。

参见 Promise.prototype.then()

关于Node.js - 在 ES6 promise 链中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41730691/

相关文章:

c++ - 将数据从 OSX 应用程序推送到 nodeJS

php - 引用 - 这个错误在 PHP 中意味着什么?

javascript - Aurelia - 等待在路由器预渲染步骤中返回的 promise

javascript - 解决 promise 是一个异步过程吗?

node.js - 找不到模块 : Can't resolve 'async_hooks'

javascript - 如何使用 Socket.io 在一条消息中发送两个变量?

javascript - 全局安装 Sails.js 出现依赖错误

C 文件处理中的编译错误

c# - 如何知道在C#代码中具有TRY CATCH处理的存储过程中是否存在错误

Javascript 异步示例不起作用