2017-03-08 6 views
0

Also, ich habe den folgenden Code:Verwenden von abgelehnten Versprechen, mit schlechten HTTP-Aufrufen umzugehen?

function SignUp(req, res, next){ 

    const userCreds = { 
     email: req.body.email, 
     password: req.body.password 
    } 

    //Username and password must exist 
    if(!userCreds.email || !userCreds.password){ 
     res.status(422).send({ error: 'Email and Password required'}); 
     throw new Error(('Email and Password Required')); 
    } 

    //See if email is already being used 
    Users.findOne({ email: userCreds.email }) 
    .then(function(user){ 
     //If user does exist, return Error 
     if(user){ 
      res.status(422).send({ error: 'Email is in use'}); 
      throw new Error(('Email and Password Required')); 
     } 

     //Else if email is true, create and save user error 
     const newUser = new Users(userCreds); 

     //Save the user 
     return newUser.save(); //Return promise 
    }) 
    .then(function(doc){ 
     //Respond saying all OK 
     res.json({ 
      success: true, 
      email: doc.email 
     }); 
    }) 
    .catch(function(err){ 
     if(err) 
      return next(err); 
    }); 
} 

Die obige Funktion auf eine Express Route geführt wird, wie diese app.get('/signup', SignUp);

In diesem Code gibt es zwei verschiedene ‚Fehler‘, die auftreten können und Ich muss damit umgehen. Eine Art von Fehler besteht darin, dass die Benutzeranfrage nicht bearbeitet werden kann (Versuch, ein Konto zu erstellen, ohne sowohl E-Mail und Passwort zu liefern, als auch eine E-Mail zu verwenden, die bereits verwendet wird). Die zweite Fehlerart ist eine, in der ich weniger Kontrolle habe: abgelehnte Versprechen aus dem Mongoose-Paket.

Nehmen wir an, dass ich eine ungültige Anfrage erhalten habe, einen Fehler vom Typ 1. Ich möchte damit umgehen, indem ich den Header der Antwort auf 422 setze und diese Antwort mit einer Nachricht verschicke, die detailliert, warum sie nicht verarbeitet werden konnte. An diesem Punkt würde die Ausführung enden.

Wenn ich einen Fehler vom Typ 2 erhalte, möchte ich next(error) aufrufen und die Ausführung an diesem Punkt stoppen.

Das Problem ist, durch Verketten Funktionen, kann ich nicht return von einem Block des Codes ohne in die folgenden .next() springen.

Eine Möglichkeit, dies zu umgehen ist durch einen Fehler über throw new Error() werfen, wenn ich einen Fehler von jedem Typ 1 oder 2 erhalten, und den Fall in .catch() handhaben, aber ich bin nicht sicher, wie viel von einer guten oder schlechter Praxis würde dies Sein.

Wie kann ich es so machen, dass ich den Fehler in einem Block behandeln und dann Ausführung stoppen kann? Und wäre das der beste Weg?

Gibt es eine bessere Möglichkeit, diese Art von Situationen in Express zu behandeln? Fehle ich etwas?

Vielen Dank!

Antwort

0

Eine Lösung wäre, eine Error Unterklasse (zum Beispiel mit error-subclass) zu erstellen und Instanzen davon zu werfen, falls Sie einen Verarbeitungsfehler melden möchten.

Anschließend im Handler .catch() überprüfen Sie, ob der Fehler eine Instanz dieser benutzerdefinierten Fehlerklasse ist, und wenn ja, geben Sie eine 422-Antwort zurück. Wenn nicht, übergeben Sie es stattdessen an next:

const ErrorSubclass = require('error-subclass').default; 

class ProcessingError extends ErrorSubclass {} 

Users.findOne({ email: userCreds.email }) 
.then(function(user){ 
    if (user) { 
     throw new ProcessingError('Email and Password Required'); 
    } 
    ... 
}).catch(function(err) { 
    if (err instanceof ProcessingError) { 
    return res.status(422).send({ error: err.message }); 
    } 
    next(err); 
}); 
Verwandte Themen