2016-08-05 7 views
2

私のコントローラーでは、結果を得るか、呼び出された関数からエラーをキャッチすることを期待して、別の関数を呼び出すエンドポイント関数があります。呼び出された関数generateInvitesnode.js - mongooseコールバックでスローされたcatchエラー

exports.createInvites = (req, res) => { 
    // code... 

    try { 

    generateInvitations(requirements, data => { 

     res.status(200).json({data}); 
    }); 

    } catch (err) { 
    console.log(`caught the error: ${err}`); 

    return res.status(500).json(err); 
    } 
} 

、私はマングースを使ってMongoDBのために生成されたオブジェクトを保存し、そして1がある場合は、エラーをスローします。上記のコード

function generateInvitations(requirements, cb) { 

    const { expirationDate, credits, numOfUse, numOfInvites } = requirements; 
    let invitationCodes = []; 
    for (let i = 0; i < numOfInvites; i++) { 

    const code = randomString(CODE_LENGTH); 
    invitationCodes.push(code); 

    const invitation = new Invitation({ 
     // code, 
     numOfUse, 
     expirationDate, 
     credits 
    }); 

    invitation.save((err, obj) => { 

     if (err) { 
     throw err; // it should throw a ValidationError here 
     } 
    }); 
    } 
    cb(invitationCodes); 

} 

generateInvitesでスローされたエラーを処理する私の試みです。もちろん、私はどんなエラーも捕まえることができませんでした。私は何を間違えたのですか?代わりに私は何をすべきですか?

+1

お約束になっているはずです。非同期のエラー処理はコールバックでは醜いです。約束して文明化しました – thedarklord47

答えて

1

コールバックは、自分自身のコールバックにあるため、エラーがスローされるよりもずっと前に発生するという事実に対処する必要があります。私はPromise.allが約束を返すすべての保存操作を待つことを提案します。

function generateInvitations(requirements) { 
    const { expirationDate, credits, numOfUse, numOfInvites } = requirements; 
    let promises = []; 

    for (let i = 0; i < numOfInvites; i++) { 
    const code = randomString(CODE_LENGTH); 

    const invitation = new Invitation({ 
     // code, 
     numOfUse, 
     expirationDate, 
     credits 
    }); 

    promises.push(invitation.save()); 
    } 
    return Promise.all(promises): 
} 

そして:

generateInvitations(requirements) 
    .then(data => res.status(200).json({data})) 
    .catch(err => { 
    console.log(`caught the error: ${err}`); 
    return res.status(500).json(err); 
    }); 
+1

あなたのコードには1つの重大なバグがあり、 'generateInvitations'はすべての保存操作が完了する前に解決され、エラーが発生しても処理されません。 Promise.allまたはPromise.mapを使用する必要があります。 – alexmac

+0

@alexmacおっと、ありがとうございます。 – aw04

+1

mongoose関数は約束を返すので、約束を作成して 'reject、resolve'コールバックを使う必要はありません。 save関数の結果を返します: 'promises.push(invitation.save())'。 – alexmac

関連する問題