‫-: Wie ich im letzten
‫Video erwähnt habe, gibt es drei
‫Arten von Fehlern, die von Mongoose
‫erzeugt werden können, die wir als Betriebsfehler markieren
‫müssen, damit wir aussagekräftige Fehlermeldungen an Kunden in der
‫Produktion zurücksenden können.
‫Und jetzt beginnen wir mit der Simulation dieser drei Fehler, okay?
‫Die erste ist, wenn wir hier eine ungültige ID versuchen,
‫also einfach so etwas,
‫und Mongoose wird dies nicht in eine
‫MongoDB-ID konvertieren können, denken Sie daran.
‫Dies ist also der Fehler, den wir gerade bekommen, und
‫eigentlich können Sie hier all das Zeug sehen,
‫das wir definiert haben, das wir in Produktionen sehen wollten.
‫Also das gesamte Fehlerobjekt, dann die Fehlermeldung
‫und auch der komplette Stack, okay?
‫Dies ist also ein perfektes Beispiel
‫für einen Bedienungsfehler.
‫Dies kann also sehr gut passieren,
‫und wir müssen eine aussagekräftige Antwort zurücksenden,
‫um diesen Fehler zu beheben.
‫Und dies ist ein perfektes Beispiel für einen Bedienungsfehler,
‫der einem Kunden sehr wahrscheinlich irgendwann passiert, und wir müssen ihn
‫also als einen behandeln, in Ordnung?
‫Also, im Grunde durch das Senden einer
‫netten Fehlermeldung anstelle von
‫so etwas, was für keinen Client etwas bedeutet, oder?
‫Okay, das Ziel hier wird
‫es wieder sein, diesen Fehler grundsätzlich als betriebsbereit zu markieren
‫und eine aussagekräftige Nachricht zu erstellen, in Ordnung?
‫Aber bevor wir das tun
‫können, werfen wir einen Blick auf
‫die anderen beiden Mungo-Fehler, die wir ebenfalls als betriebsbereit markieren müssen, okay?
‫Lassen Sie uns also
‫eine neue Tour erstellen, und ich werde einen doppelten Namen erstellen.
‫Also, lass uns diesen hier einfach kopieren.
‫Und ich denke, alle Werte hier
‫sind richtig, also versuchen wir es jetzt.
‫Und tatsächlich erhalten wir hier den Fehler, den wir bereits
‫kennen, nämlich einen doppelten
‫Schlüsselfehler, weil wir bereits eine
‫Tour oder ein Dokument mit dem Namen Forest Hiker haben, okay?
‫Dies ist also wieder
‫ein Fehler, der irgendwann auftreten
‫wird, und auch
‫hier gibt es keine sehr aussagekräftige Fehlermeldung, oder?
‫Und das müssen wir wieder ändern.
‫Dann geht es beim dritten auch
‫um Validierung, und das machen wir hier in der Update Tour.
‫Nehmen wir an, wir möchten einen Bewertungsdurchschnitt von sechs haben, von
‫dem wir wissen, dass er ungültig ist, oder?
‫Weil wir gesagt haben, dass der maximale Durchschnitt der
‫Bewertungen fünf sein könnte.
‫Mal sehen,
‫und tatsächlich bekommen wir diesen ValidationError, richtig?
‫Es wird also als
‫ValidationError bezeichnet und enthält dieses Fehlerobjekt mit allen Fehlern.
‫Lassen Sie uns hier noch einen anderen setzen.
‫Sagen wir also Schwierigkeit
‫und dann noch etwas anderes,
‫also eine, die nicht leicht, mittel oder schwierig
‫ist, und so erhalten wir jetzt diese beiden Objekte hier.
‫Eine für die Bewertungen und eine für den Schwierigkeitsgrad, in Ordnung?
‫Dies sind also
‫die drei Fehler, die wir
‫als betriebsbereit markieren werden, beginnend mit
‫diesem ersten, also im Grunde der Typ CastError, okay?
‫Also, lass uns hierher zurückkehren und das machen
‫wir hier noch einmal, weil wir das nur in der Produktion machen wollen, okay?
‫In der Entwicklung ist uns das alles egal.
‫Wir wollen nur unsere Fehler
‫sehen, um sie grundsätzlich beheben zu können,
‫aber in der Produktion wollen wir
‫hier die aussagekräftigen Fehlermeldungen an die Clients senden.
‫Sagen wir also, wenn err. name ist gleich
‫CastError, und so werden wir diese Art von Fehler
‫hier identifizieren, über die
‫wir gerade gesprochen haben,
‫weil sie den Namen CastError hat, in Ordnung?
‫Also wenn irr. name ist
‫CastError, dann rufen wir eine spezielle Funktion auf, die wir
‫in einer Sekunde
‫erstellen werden, die handleCastError heißt.
‫Und dann sage ich hier auch DB für
‫Datenbank, damit wir wissen, dass dies mit unserer Datenbank zusammenhängt, okay?
‫Und so wird es funktionieren.
‫Wir werden den Fehler,
‫den Mongoose erstellt hat, an diese
‫Funktion übergeben, also einfach so, und dies
‫wird dann einen neuen Fehler zurückgeben, der ohne AppError-Klasse erstellt wurde, okay?
‫Und dieser Fehler wird dann als betriebsbereit markiert, denn
‫denken Sie daran, dass bei allen
‫unseren AppErrors die is
‫operational-Eigenschaften automatisch auf zwei gesetzt sind, oder?
‫Das wird also einen Fehler zurückgeben, also speichern wir das, okay?
‫Und so wurde das irrtümlicherweise gespeichert.
‫Es ist jetzt überhaupt
‫keine gute Praxis, die Argumente einer Funktion zu überschreiben, okay?
‫Der Fehler kommt also von dieser mittleren Fehlerfunktion, oder?
‫Anstatt dies zu tun, werde ich
‫von hier aus
‫tatsächlich eine Hardcopy dieses Fehlerobjekts erstellen, okay?
‫Also let, und ich benutze let, und nicht const, weil
‫wir dann natürlich später
‫hier einen neuen Fehler neu zuweisen werden.
‫Nennen wir diesen einen Fehler statt einfach err,
‫was der normale Name von Fehlern in Express ist.
‫Und so verwenden wir wieder unseren
‫Trick, bei dem wir die Destrukturierung des ursprünglichen Fehlers verwenden, okay?
‫Daher verwenden wir von nun an diesen Fehler anstelle von err.
‫Also hier und hier und hier.
‫In Ordung?
‫Lassen Sie uns
‫nun diese Funktion hier erstellen.
‫Lassen Sie uns das gleich zu Beginn hier aufstellen.
‫In Ordung.
‫Denken Sie daran, dass dies einen
‫Fehler erhält, und jetzt werde ich es einfach so nennen, weil
‫dies wieder so etwas wie der Standard in Express ist.
‫Und zu Beginn werfen
‫wir noch einmal einen Blick auf das Fehlerobjekt hier, okay?
‫Hier haben wir also den Weg und wir haben auch den Wert, okay?
‫Der Pfad hier ist also im Grunde der
‫Name des Feldes, für das die Eingabedaten das falsche Format haben, okay?
‫Und dieser Wert hier ist dann dieser, der natürlich
‫der ist, den wir in der Vergangenheit gemacht haben, in Ordnung?
‫Dies kann also nicht nur für die ID passieren, sondern
‫wirklich für jedes Feld, das wir
‫mit einem Wert im falschen Format abfragen, in Ordnung?
‫Lassen Sie uns nun im
‫Grunde eine Zeichenfolge erstellen, die besagt,
‫dass wir in diesem Fall eine ungültige ID mit dem Wert dieser ID haben, in Ordnung?
‫Es ist also Weg und Wert, okay?
‫Erstellen wir also hier eine Nachricht und sagen
‫Sie Ungültiger Fehler. Pfad ist
‫falsch. Wert.
‫Okay?
‫Und so geben wir jetzt einfach unseren eigenen AppError zurück.
‫Okay?
‫Also, wie ich schon ein paar Mal erwähnt habe, okay?
‫Also AppError, und das muss ich eigentlich hier einbinden oder
‫fordern, weil ich es noch nicht gemacht habe.
‫Const AppError ist also gleich zu erfordern, und eine
‫Ebene nach oben verschieben, dann in den Ordner
‫Dienstprogramme und dann den appError.
‫Hier ist es.
‫Und so übergeben wir jetzt in oder AppError unsere Nachricht
‫und den 400-Statuscode, der für Bad Request steht.
‫Okay, und so verwandeln wir den
‫seltsamen Fehler, den wir von
‫Mongoose erhalten haben, in
‫einen Betriebsfehler mit
‫einer netten freundlichen Nachricht, die (kichert)
‫ein
‫echter Mensch lesen kann, in Ordnung?
‫Okay, eine letzte Sache, die wir
‫hier ändern müssen, ist, auch diese hier auf Fehler zu setzen, okay?
‫Und wenn unser Fehler jetzt CastError ist,
‫dann übergeben wir den Fehler an
‫diese Funktion, die unseren AppError zurückgibt,
‫also diesen, der dann mit unserem sendErrorProd an
‫den Client gesendet wird. okay?
‫Und so versuchen wir es jetzt tatsächlich.
‫Also hier, in unserem Paket. json,
‫wir haben dieses start:prod-Skript, und versuchen wir es also.
‫Also, npm führt start:prod aus, und ich kann diese npm-Skriptnamen mit
‫der Registerkarte hier im Terminal automatisch vervollständigen, okay?
‫Und das wird im
‫Grunde genommen einen Prozess im Produktionsmodus starten, okay?
‫Und so versuchen wir es jetzt noch einmal.
‫Wenn Sie diese Anfrage
‫jetzt ausführen, sollten wir die soeben
‫erstellte Fehlermeldung zurückbekommen, da wir gerade in der Produktion sind.
‫Und tatsächlich, hier ist es.
‫Wir haben also einen ungültigen und dann einen Feldnamen
‫oder eigentlich den Pfadnamen und dann den Wert, den wir
‫eingegeben haben.
‫Wenn wir also etwas
‫anderes ausprobieren, dann bekommen wir natürlich
‫diesen und natürlich auch unseren 400 Bad Request Code.
‫OK großartig.
‫So, dieser wird jetzt behandelt.
‫In der nächsten Vorlesung kümmern wir uns dann um die
‫nächste, die für doppelte Feldnamen ist, in Ordnung?
‫Also, bis dann in einer Sekunde.