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.
* "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. –
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
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. –