2016-08-05 41 views
2

In meinem Controller habe ich eine Endpunktfunktion, die eine andere Funktion aufruft, in der Erwartung, ein Ergebnis zu erhalten oder Fehler von der aufgerufenen Funktion zu fangen.node.js - catch Fehler in einem Mungo-Rückruf

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); 
    } 
} 

In der aufgerufenen Funktion generateInvites, I Objekt speichern erzeugt MongoDB Mungo verwenden und einen Fehler aus, wenn es einen gibt.

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

} 

Above Code ist mein Versuch, Fehler in generateInvites geworfen zu behandeln. Natürlich konnte ich keinen Fehler feststellen. Was habe ich falsch gemacht? und was soll ich stattdessen tun?

+1

Sie in Versprechen aussehen sollte. Die asynchrone Fehlerbehandlung ist bei Callbacks hässlich. Versprechungen machen es viel mehr .. zivilisiert – thedarklord47

Antwort

1

Sie müssen mit der Tatsache umgehen, dass der Callback lange vor einem Fehler ausgelöst wird, da es sich um einen Callback handelt. Ich würde vorschlagen, Promise.all auf alle speichern Operationen warten, die Versprechen verspricht.

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): 
} 

Und dann:

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

Ihr Code enthält einen kritischen Fehler, 'generateInvitations' wird aufgelöst, bevor alle Speicheroperationen beendet sind, und sogar ein Fehler wird ausgelöst, der nicht verarbeitet wird. Sie müssen dort "Promise.all" oder "Promise.map" verwenden. – alexmac

+0

@alexmac oops du hast Recht, danke. sollte jetzt gut sein – aw04

+1

mongoose Funktionen versprechen, so dass Sie nicht brauchen, um ein Versprechen zu erstellen und verwenden Sie "ablehnen, lösen" Callbacks. Gib einfach das Ergebnis der Speicherfunktion zurück: 'promises.push (invitation.save())'. – alexmac