2017-01-18 2 views
2

私が開発しているNode.js/Express APIの一部として、カスタムエラーハンドラを構築しました。 BadRequestまたはNotFoundなどNode.js - ES6のプロミスチェーン内で例外をスローする

私は約束チェーン内に投げたいときに問題が発生します。たとえば:

あまり話題に読んだ後、私はこのエラーは約束によって飲み込まれ、したがって、未処理の約束の拒絶反応を起こすことになることがわかります。

私は特定のエラーを処理する方法がわかりませんが、私は拒否できます。

また、拒否するには、私の約束の中に新しい約束を作る必要はありませんか?それは面倒です。

プロミスチェーン内で特定の例外をスローする方法をアドバイスできますか?

+0

を参照してください、あなたはどちらか 'throw'をやったり拒否約束を返すことによって、エラーを返します。どちらの場合も、プロミスチェーンが拒絶状態に変わり、プロミスチェーンの上位レベルで処理できます。エラーを処理するチェーン内の正確な場所は、達成しようとしているものによって異なります。しかし、あなたはどこかで約束の拒否を処理しなければなりません。非同期例外は他の場所で捕らえることができないので、どこかでそれらを処理せずに、それらの条件が発生したときに何をすべきかを決めることなく、ほとんど有用な目的を果たさない。 – jfriend00

答えて

2

then()への最初のコールバックに加えて、コールバックを解決してデータを受信するコールバックを拒否し、エラーを受け取る2番目のコールバックを提供することもできます。あなたは、次のの2番目のコールバックに、この特定のエラーをキャッチできます。

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()

+1

多くのありがとう@dNitro - この例はとても役に立ちました。 – Ben