編集2018-01-18:約束の代わりにasync/awaitを使用してください。すべての問題を解決します。Mongoose Promiseはエラー処理中にチェーンを切断します
は、私は私が見つけたユーザーが一人もいない場合、実行を停止し、ちょうど送りたいNodeJS
User.find({ name: 'John' })
.then((users) => {
if (!users.length) return res.send('No users found.');
return Request.find({ cost: 100 })
})
.then((requests) => {
console.log('should not get here');
return res.json(requests);
})
.catch((err) => {
res.status(500).json(err);
})
にマングースのために、このコードを持っている「いいえユーザーは見つかりませんでした。」他の何も実行せずに。
代わりにthrow res.send('No users found.');
を使用することができます。
しかし、それは私が本物のエラー(例えば保存や更新中に起こる可能性がある)をキャッチして管理することを不可能にします。
私はこれにどのようにアプローチすればよいですか?私は別のコード構造を使うべきですか?この構造の欠点を除いて、この構造がいかにシンプルで維持可能であるかは好きです。
* "しかし、それが私の本物のエラーをキャッチすることは不可能になる" *どのようにそうですか?私が最後にドライバをチェックしたときに、エラーコード付きの構造化エラーオブジェクトが返されました。通常のパターンは、「重複キーエラー」の「インゴーイング/警告」です。例外は実際には重大なもののデータベース接続が失われたような致命的なものではありません。だから典型的なことは、あなたの '.catch()'の中で "inspect"して、それが持っている情報に基づいて 'err'で何をすべきかを決定することです。だから、それを特定する何かで '新しいError()'を投げる** IS **正しいこと。 –
エラー、mongooseエラー、mongodbエラーが発生する原因はたくさんあります。 私は使用すべき統一構造を提案していますか? 私はちょうど '' 'if(!err.domain){//これは本物のエラーです}' '' そのように私は '' 'res.send()' ''以外のものを除外しています。 Isエラーを認識する良い方法はありますか? – Hafez
"mongoose error"のようなものはありません。これは「ドライバーにまっすぐ」です。私はちょうどあなたに、世界の他の部分が何をしているのか、ちょっとしたパッケージの良い例を与えました。いくつかの意図的な書き込みエラーを自分で作成し、返されたオブジェクトを調べると、それらがどのようなものかを正確に表示します。あなたは同じことをする必要があります。私が与えた例のように、**通常の**練習では、返されたエラーオブジェクトのプロパティとして 'err.code'を見て、重複するキー' E11000'を期待しています。 –