2016-10-19 5 views
0

Ich habe die folgende Funktion zum Erstellen eines Benutzers in meiner App, ich versuche zu erkennen, wenn Three bereits ein Admin-Benutzer erstellt und verhindern, dass ein anderer erstellen.Unbehandelt 'Fehler' Ereignis beim Trowing-Fehler

export async function createUser (ctx) { 
    if (ctx.request.body.type == undefined ) { 
     ctx.throw(400, 'Bad Request') 
    } 
    if (ctx.request.body.type === 'admin') { 
    User.findOne({type:'admin'}, (err, usr) => { 
     if (err) 
     ctx.throw(422, err.message) 
     if (usr){ 
     ctx.throw(400, 'Duplicate Admin') 
     } 
    }) 
    } 
.... 

Die ersten ctx.throw(400, 'Bad Request') funktioniert, aber wenn ein anderer Benutzer admin ist die ctx.throw(400, 'Duplicate Admin') verursacht den folgenden Fehler, stürzt die App gefunden:

events.js:160 
     throw er; // Unhandled 'error' event 
    ^

BadRequestError: Duplicate Admin 

Ich werfe den Fehler in einer unangemessenen Weise? Was bewirkt, dass der erste Wurf ohne Absturz funktioniert, aber nicht der zweite?

Vielen Dank im Voraus für jede Hilfe

Antwort

0

Sie werfen asynchron innerhalb des User.findOne Rückruf. Dies stürzt ab.

Betrachten Sie stattdessen die Bibliothek, die Sie verwenden, User.findOne und sehen, ob es ein Versprechen zurückgeben kann, oder wickeln Sie es in Bluebird Promise.promisify, wenn es nicht tut.

Dies ist der Code, den Sie bei ankommen:

const user = await User.findOne({ type: 'admin' }) // returns a promise 
if (user) ctx.throw(400, 'Duplicate admin') 
0

Zunächst prüfen die Art der ‚user‘ variable.If es ein Array oder ein Objekt, wird if(user){....} immer true zurück, auch wenn es leer ist. Und versuchen

app.on('error', function() { 
    console.log('yep this is an error'); 
}); 

Ereignis-Listener hinzufügen

Verwandte Themen