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

时间:2017-01-18 22:34:46

标签: 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拒绝。

我知道我可以拒绝但是我不知道如何处理特定的错误(而不是我不想要的拒绝收集)。

另外,要拒绝,我不需要在我的承诺链中创建新的承诺吗?那感觉很乱。

有人可以建议如何处理在承诺链中抛出特定异常吗?

1 个答案:

答案 0 :(得分:3)

除了第一次回调 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
  });
默认情况下,

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

请参阅Promise.prototype.then()