‫Kursleiter: Lassen Sie
‫uns nun unser AppError-Klassengeschäft etwas
‫mehr nutzen, indem wir ein paar 404-Fehler
‫und einige unserer Tour-Handler-Funktionen hinzufügen.
‫Bevor wir diese 404-Fehler
‫tatsächlich implementieren, wollte ich jetzt nur sagen,
‫dass wir die catchAsync-Funktion natürlich auch in unserem
‫Router hätten verwenden können, okay?
‫Lassen Sie mich Ihnen also zeigen, wie das funktionieren würde.
‫Hier in TourRoutes
‫hätte ich diese Funktion also
‫einfach so in catchAsync einpacken können, anstatt
‫es direkt hier im Controller zu tun.
‫Also, hier, wo ich es tatsächlich getan habe, oder?
‫Und das hätte genau das gleiche Ergebnis
‫gehabt, aber ich
‫habe es nicht so gemacht, weil
‫ich mir so merken muss,
‫welche dieser Methoden hier eigentlich
‫eine Sync-Methode ist, okay, also nur
‫bei denen füge ich tatsächlich die catchAsync-Funktion hinzu , rechts?
‫Nun, in diesem Fall sind eigentlich alle asynchrone Funktionen und
‫daher ist das hier in diesem Beispiel nicht wirklich der Fall,
‫aber es werden später einige
‫Beispiele geben, bei denen nicht alle Handler asynchrone Funktionen sind, und
‫in diesem
‫Fall hätte ich wirklich um mich
‫daran zu erinnern, welche von ihnen ich in catchAsync
‫einpacken muss und welche
‫nicht, und so ist es
‫viel einfacher, dies im Controller zu tun, weil einfach jedes
‫Mal, wenn ich hier
‫eine async-Funktion schreibe, sie bereits
‫wissen, dass ich sie einpacken muss es in catchAsync.
‫Okay.
‫Also, ich mache es nicht hier,
‫ich mache es einfach so, wie ich es euch im letzten Video gezeigt habe.
‫Okay und tatsächlich bin ich einmal auf einen Fehler gestoßen,
‫der wirklich schwer zu
‫finden war, weil ich tatsächlich
‫eine Funktion, die nicht asynchron war, in catchAsync
‫verpackt habe und damit wirklich nicht
‫funktionierte und ich nicht herausfinden konnte, wo der
‫Fehler lag und viel verschwendet habe Zeit dazu.
‫Und so platziere ich catchAsync seither nicht mehr hier, sondern
‫ganz nah dort, wo ich es
‫tatsächlich brauche, so nah am eigentlich asynchronen Code.
‫Okay, und nachdem das
‫gesagt wurde, implementieren wir jetzt einige 404-Fehler hier.
‫In Ordnung, also möchte ich
‫Ihnen zunächst noch einmal das Beispiel zeigen,
‫das wir im letzten Video gemacht haben.
‫Okay, wir haben also versucht, eine Tour
‫für diese seltsame ID zu erstellen, die nicht wirklich
‫existiert, und
‫der Fehler, den wir erhalten haben, ist,
‫dass Mongoose diese Zeichenfolge hier im Grunde
‫nicht in eine gültige ID für MongoDB umwandeln konnte.
‫Aber was passiert, wenn wir tatsächlich eine gültige MongoDB-ID verwenden?
‫Also, lass uns zum Beispiel, ja, lass uns diese hier
‫kopieren, okay,
‫und diese wird natürlich ein Ergebnis haben und also
‫lass es uns nur leicht ändern, also zum Beispiel,
‫dies hier auf Null zu ändern, ist
‫immer noch eine gültige ID , also
‫sieht es so aus und
‫es sieht genauso aus wie vorher,
‫ich habe nur eine
‫Nummer geändert, aber diese ID wird es wahrscheinlich nicht geben.
‫Also, mal sehen, was wir dann bekommen.
‫Und tatsächlich ist unser Ergebnis hier null.
‫In Ordnung, und das ist nicht wirklich das, was wir wollen, oder?
‫Wir wollen hier einen 404-Statuscode anzeigen und sagen, dass
‫diese Tour nicht gefunden wurde.
‫Okay und so verwenden wir jetzt die orAppError-Klasse,
‫um das zu implementieren.
‫Denken Sie nur daran, dass
‫die Tour, die wir hier zurück bekommen, null ist, okay?
‫Also null, auf das wir jetzt testen können.
‫Wenn wir also zu unserem getTour-Handler gehen,
‫implementieren wir jetzt, wenn keine Tour vorhanden ist, und in diesem Fall erstellen wir
‫einen Fehler, und dies funktioniert hier, denn
‫wenn
‫keine Tour vorhanden ist,
‫ist sie null.
‫Denken Sie daran, dass null in JavaScript ein falscher Wert ist,
‫also ein Wert, der hier in einer if-Anweisung
‫in false umgewandelt wird.
‫Okay, und wenn es keine Tour
‫gibt, dann ist
‫Tour falsch und dann ist nicht falsch
‫natürlich wahr und so geben wir dann diesen if-Block ein.
‫Was wollen wir also tun, wenn keine Tour stattfindet?
‫Nun, wir wollen als nächstes einen Fehler erstellen.
‫Also, um direkt in eine fehlerhafte und verknüpfte Middleware
‫zu springen.
‫Also, wir machen einen neuen AppError, der noch
‫nicht verfügbar ist, wir müssen ihn noch
‫importieren, aber lasst uns ihn hier sofort verwenden.
‫Okay, und dann
‫sagen wir einfach Keine Tour mit dieser ID gefunden.
‫Und dann ein Statuscode.
‫Denken Sie daran, dass das zweite Argument 404 ist, in Ordnung?
‫Jetzt noch eine letzte Sache, die
‫wir hier tun müssen, nämlich return, okay, weil
‫wir diese Funktion sofort zurückgeben und nicht
‫zur nächsten Zeile übergehen möchten, die diese
‫wäre und
‫dann im Grunde versuchen würde, zwei Antworten zu senden, und wir
‫Ich hoffe, dass Sie sich daran
‫erinnern werden, und das
‫ist der Grund, warum wir immer hierher zurückkehren müssen.
‫Okay, lassen Sie uns jetzt fortfahren und schnell den appError importieren und
‫der ist ähnlich wie hier, also lassen
‫Sie uns einfach duplizieren.
‫Okay, und hier ist es tatsächlich mit einem großen A.
‫Alles klar, speichern wir es und
‫versuchen wir es jetzt
‫noch einmal und jetzt wurde tatsächlich keine Tour mit dieser ID 404 gefunden.
‫Perfekt, also genau das, was wir wollten.
‫Ach und du hast auch gesehen, dass wir hier versagt haben.
‫Okay und das kommt auch von oder Klasse.
‫Super, das funktioniert und ich hoffe sehr,
‫dass Sie jetzt genau verstanden haben, wie diese
‫ganze Fehlerbehandlung jetzt funktioniert.
‫Okay, also erstellen wir wieder einen Fehler und übergeben
‫diesen Fehler dann an next und
‫sobald next etwas empfängt, geht es davon
‫aus, dass es sich um
‫einen Fehler
‫handelt und springt direkt in die globale Fehlerbehandlungs-Middleware,
‫die dann die Antwort für uns sendet , okay?
‫Also kopieren wir
‫diesen und fügen ihn in alle anderen
‫Handler ein, die Dokumente basierend auf der ID abfragen.
‫Also keine Tour erstellen, sondern eine Tour aktualisieren, okay?
‫Und hier
‫das gleiche, wenn wir versuchen, die
‫Tour zu aktualisieren, die
‫nicht existiert, erhalten wir genau den gleichen Fehler.
‫Zum Schluss natürlich das gleiche mit delete.
‫Und jetzt sehen Sie, dass ESLint mir diesen Fehler hier und
‫so gegeben hat, weil diese Tour nicht definiert ist
‫und in diesem Fall ESLint mich wirklich davor bewahrt
‫hat, diesen Fehler zu verursachen.
‫Rechts?
‫Also, wieder ohne ESLint, hätte ich
‫es wahrscheinlich einfach hier
‫eingefügt und
‫es beendet, ohne zu bemerken, dass Tour nirgendwo
‫in dieser Funktion definiert
‫ist, aber da wir dieses wirklich wertvolle Tool installiert
‫haben, kann ich es jetzt reparieren.
‫Also gut, bis
‫hierhin haben wir diese Löschanweisung hier einfach abgewartet und das Ergebnis nicht
‫gespeichert und das liegt einfach
‫daran, dass wir sie nicht brauchten.
‫Okay, aber im Moment brauchen wir es tatsächlich,
‫weil wir diese Tour-Variable haben wollen,
‫um zu überprüfen, ob es tatsächlich eine Tour gibt oder nicht.
‫Also ganz einfach, const tour und dann
‫gleich das Ergebnis, speichern
‫und dann ist der Fehler weg.
‫So großartig.
‫ESLint bei der Arbeit, in Ordnung?
‫Jetzt haben Sie vielleicht bemerkt, dass ich diesen 404-Fehler hier in diesem
‫getAllTour-Handler nicht hinzugefügt habe.
‫Also, warum habe ich das getan?
‫Lassen Sie mich Ihnen erklären, warum.
‫Wenn also beispielsweise keine Ergebnisse gefunden wurden,
‫keine Ergebnisse für einen Filter vorhanden sind oder weil die
‫angeforderte Seite nicht
‫existiert, können wir natürlich einen 404-Fehler senden und
‫sagen, dass die Daten nicht vorhanden
‫sind fand aber meiner Meinung nach
‫und auch der Meinung anderer Entwickler,
‫dass diese Anfrage nicht ganz richtig ist, da
‫nicht wirklich ein Fehler vorlag.
‫Ich meine, die Anfrage wurde korrekt empfangen.
‫Die Datenbank hat korrekt nach den Touren
‫gesucht und genau null Datensätze gefunden.
‫Daher werden diese null
‫Datensätze genau das, was wir zusammen mit dem 200 HTTP-Code zurücksenden.
‫Also gut, ich bin wieder der
‫Meinung, dass es nicht wirklich einen Fehler
‫geben kann, wenn ein Benutzer alle Touren anfordert,
‫es sei denn, es liegt ein Fehler in der Datenbank
‫oder ähnliches vor.
‫Aber in diesem
‫Fall wird Mongoose dann automatisch einen Fehler ausgeben.
‫Richtig, was dann wiederum von unserer oder
‫catchAsync-Funktion abgefangen und, wie
‫Sie bereits wissen,
‫in unserem globalen Fehlerhandler und wie Sie
‫bereits
‫wissen, in unserer globalen Fehlerbehandlungs-Middleware behandelt werden.
‫In Ordnung, ich habe diese Worte jetzt schon so oft gesagt.
‫Wie auch immer, ich hoffe,
‫das machte Sinn und so, ja, lass uns jetzt weitermachen.