Node.js – 在ES6承诺链中抛出exception

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

当我想要抛弃承诺链时,就会出现问题。 例如:

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

经过对这个话题的大量阅读后,我发现这个错误会被诺言所吞噬,从而导致一个未被处理的Promise拒绝。

我知道我可以拒绝,但我不知道如何才能处理具体的错误(而不是一个拒绝,我不想要)。

另外,要拒绝,我不需要在我的承诺链里创造一个新的承诺吗? 这感觉凌乱。

任何人都可以build议如何处理在承诺链中抛出一个特定的exception?

除了parsingcallback和接收数据的第一个callback函数()之外 ,还可以提供第二个callback函数,它是拒绝callback函数,它接收错误。 所以你可以在下一次的callback中捕获这个特定的错误:

 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,如果它的任何callback(无论是第一个还是第二个)都抛出一个错误,那么它返回一个被拒绝的promise,其原因将被下一个拒绝callback所捕获(如果有的话),或者被catch结束。 所以你不需要创造一个新的承诺。

参见Promise.prototype.then()