2017-11-02 5 views
0

Bearbeiten 2018-01-18: Verwenden Sie async/erwarten statt Versprechen. Es wird alle Ihre Probleme lösen.Mongoose Versprechen brechen dann Kette während der Behandlung von Fehlern

Ich habe diesen Code für Mungo in 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); 
     }) 

Ich wünschte, die Hinrichtung zu stoppen, wenn es keine Nutzer gefunden, und nur senden „Es wurden keine Nutzer.“ ohne etwas anderes auszuführen.

Ich bin mir bewusst, dass ich stattdessen throw res.send('No users found.'); verwenden könnte.

aber dann würde das es mir unmöglich machen, echte Fehler - die zum Beispiel beim Speichern oder Aktualisieren passieren könnten - zu erfassen und zu verwalten.

Wie soll ich das angehen? Sollte ich eine andere Codestruktur verwenden? Ich mag, wie einfach und wartungsfreundlich diese Struktur ist, abgesehen von diesem einen Nachteil.

+0

* "aber dann würde es mir unmöglich machen, echte Fehler zu bekommen" * Wie so? Bei der letzten Überprüfung des Treibers habe ich "informative" strukturierte Fehlerobjekte mit Fehlercodes zurückgegeben. Ein reguläres Muster ist "ingnoring/warning" auf "duplicate key errors", wobei eine Ausnahme zwar nicht wirklich fatal ist, wie eine verlorene Datenbankverbindung von etwas anderem, tatsächlich aber ernst. Die typische Sache ist also, "inspizieren" Sie innerhalb Ihres '.catch()', und entscheiden Sie dann, was mit 'err' zu tun ist, basierend auf welchen Informationen es hat. Also, wirf neue Error() 'mit etwas, um es zu identifizieren ** IST ** das Richtige zu tun. –

+0

Es gibt viele Gründe, die einen Fehler verursachen könnten, einen Mungo-Fehler, einen Mongodb-Fehler. Welche einheitliche Struktur schlagen Sie vor? Ich habe gerade '' 'if (! Err.domain) {// das ist ein echter Fehler}' '' So schließe ich alles aus, was kein '' 'res.send()' '' ist gibt es einen besseren Weg, Fehler zu erkennen? – Hafez

+0

Es gibt keinen "Mungo-Fehler". Dies ist "direkt zum Fahrer". Ich habe dir nur ein nettes kleines Beispiel gegeben, was der Rest der Welt tut. Erstellen Sie einige absichtliche Schreibfehler selbst und überprüfen Sie die zurückgegebenen Objekte und dann sehen Sie genau, wie sie aussehen. Sie müssen das Gleiche tun. Wie das Beispiel, das ich gegeben habe, erwartet eine ** normale ** Praxis den doppelten Schlüssel 'E11000', indem sie' err.code' als Eigenschaft des zurückgegebenen Fehlerobjekts betrachtet. –

Antwort

1

Sie können Fehlerklassen in 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' 
    } 
} 

Ihre Fehlerbehandlungscode erweitern dann bei mehr Metadaten in den Fehler suchen kann die Entscheidung darüber, wie zur Antwort zu machen.

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

Sie wollen wahrscheinlich einen allgemeinen express API Request/Response-Handler erstellen, so dass Sie nicht die Antwort wiederholen und Fehler für jeden Handler Handhabung. Dann muss der Handler-Code nur Daten zurückgeben oder Fehler werfen.

User.find({ name: 'John' }) 
    .then((users) => { 
    if (!users.length) throw new NotFoundError('No users found.')   
    return Request.find({ cost: 100 }) 
    }) 
Verwandte Themen