2017-11-02 13 views
0

編集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.');を使用することができます。

しかし、それは私が本物のエラー(例えば保存や更新中に起こる可能性がある)をキャッチして管理することを不可能にします。

私はこれにどのようにアプローチすればよいですか?私は別のコード構造を使うべきですか?この構造の欠点を除いて、この構造がいかにシンプルで維持可能であるかは好きです。

+0

* "しかし、それが私の本物のエラーをキャッチすることは不可能になる" *どのようにそうですか?私が最後にドライバをチェックしたときに、エラーコード付きの構造化エラーオブジェクトが返されました。通常のパターンは、「重複キーエラー」の「インゴーイング/警告」です。例外は実際には重大なもののデータベース接続が失われたような致命的なものではありません。だから典型的なことは、あなたの '.catch()'の中で "inspect"して、それが持っている情報に基づいて 'err'で何をすべきかを決定することです。だから、それを特定する何かで '新しいError()'を投げる** IS **正しいこと。 –

+0

エラー、mongooseエラー、mongodbエラーが発生する原因はたくさんあります。 私は使用すべき統一構造を提案していますか? 私はちょうど '' 'if(!err.domain){//これは本物のエラーです}' '' そのように私は '' 'res.send()' ''以外のものを除外しています。 Isエラーを認識する良い方法はありますか? – Hafez

+0

"mongoose error"のようなものはありません。これは「ドライバーにまっすぐ」です。私はちょうどあなたに、世界の他の部分が何をしているのか、ちょっとしたパッケージの良い例を与えました。いくつかの意図的な書き込みエラーを自分で作成し、返されたオブジェクトを調べると、それらがどのようなものかを正確に表示します。あなたは同じことをする必要があります。私が与えた例のように、**通常の**練習では、返されたエラーオブジェクトのプロパティとして 'err.code'を見て、重複するキー' E11000'を期待しています。 –

答えて

1

あなたは、その後どのように応答する程度それの決定を行うために、エラーに多くのメタデータを見ることができますES2015/6

class ExtendedError { 
    constructor(message){ 
    super(message) 
    this.name = this.constructor.name 
    this.message = message 
    if (typeof Error.captureStackTrace === 'function'){ 
     Error.captureStackTrace(this, this.constructor) 
    } else { 
     this.stack = (new Error(message)).stack 
    } 
    } 
} 

class NotFoundError extends ExtendedError { 
    constructor(message, options){ 
    super(message) 
    this.status = 404 
    this.code = 'NF0001' 
    } 
} 

あなたのエラー処理のコードでエラークラスを拡張することができます。

User.find({ name: 'John' }) 
    .then((users) => { 
    if (!users.length) throw new NotFoundError('No users found.')   
    return Request.find({ cost: 100 }) 
    }) 
    .then((requests) => { 
    console.log('should not get here') 
    return res.json(requests); 
    }) 
    .catch((err) => { 
    let status = err.status || 500 
    res.status(500).json({ error: err }) 
    }) 

あなたはおそらく、あなたがすべてのハンドラのハンドリングレスポンスやエラーを繰り返していませんので、一般的な明示のAPIリクエスト/レスポンスハンドラを作成します。ハンドラコードはデータを返すか、エラーを投げるだけでよい。

User.find({ name: 'John' }) 
    .then((users) => { 
    if (!users.length) throw new NotFoundError('No users found.')   
    return Request.find({ cost: 100 }) 
    }) 
関連する問題