‫Lehrer: Lassen Sie uns
‫in diesem Video nun eine bessere und nützlichere Fehlerklasse
‫erstellen und auch einige Umgestaltungen vornehmen.
‫Und beginnend mit dieser Fehlerklasse
‫erstellen wir eine neue Datei in unserem Utilities-Ordner.
‫Also, neue Datei, und ich nenne
‫sie AppError, weil das der Name der Klasse sein wird, in Ordnung?
‫Also, Klasse AppError, und wir wollen eigentlich, dass alle
‫unsere AppError-Objekte dann vom eingebauten Fehler
‫erben, und lassen uns also die eingebaute Fehlerklasse erweitern.
‫Also haben wir Extended Error verwendet, okay?
‫Also, das haben wir schon mal irgendwo in
‫diesem Kurs gemacht, und das sind wieder nur ES6-Kurse, in Ordnung?
‫In diesem Fall Klassenvererbung,
‫bei der eine Klasse von der anderen erbt, okay?
‫Dann, wie immer, unser Konstruktor, und
‫was wir an ein neues
‫Objekt übergeben, das aus der AppError-Klasse
‫erstellt wurde, sind die Nachricht und der StatusCode, also nur
‫diese beiden.
‫Denken Sie daran, dass die Konstruktormethode jedes Mal aufgerufen
‫wird, wenn wir ein neues Objekt aus dieser Klasse erstellen.
‫Nun, wie üblich, wenn wir eine
‫Elternklasse erweitern, rufen wir super auf, um den Elternkonstruktor
‫aufzurufen, in Ordnung, und wir
‫tun dies mit message, weil die Nachricht tatsächlich
‫der einzige Parameter ist, den der eingebaute Fehler akzeptiert.
‫Okay, im Grunde rufen Sie also Fehler auf,
‫in Ordnung, und dann ist das
‫hier das Übliche,
‫wir setzen den statusCode auf statusCode, in Ordnung, und jetzt
‫wollen wir auch den Status selbst setzen.
‫Denken Sie also daran, dass der Status entweder fehlgeschlagen oder fehlerhaft sein
‫kann, und wir könnten dies an das
‫Objekt übergeben, aber es ist
‫auch nicht wirklich notwendig, da der Status vom statusCode abhängt.
‫Wenn also der statusCode eine 400 ist, dann
‫ist der Status fehlgeschlagen,
‫und wenn es eine 500 ist, dann wird es ein Fehler sein,
‫richtig, und so wird einfach getestet, ob
‫der statusCode mit einer Vier beginnt.
‫In JavaScript gibt es also eine MethodestartsWith,
‫die wir
‫für Strings aufrufen können, und
‫ich denke, dies ist der einfachste Weg,
‫diesen Test durchzuführen Template-String mit dem
‫Code drin, also dies, oder
‫wir können einfach statusCode verwenden.
‫Also, statusCode
‫und dann beginntWith, dann brauchen wir
‫auch hier einen String, und wenn also der statusCode
‫als String mit einer Vier beginnt, nun, dann haben wir einen Fehler.
‫Also hier, lassen Sie uns die Ternär verwenden, okay,
‫und so ist es fehlgeschlagen, wenn es
‫mit einer 4 beginnt, und ansonsten ist es ein Fehler, okay?
‫Also, sehr einfach, und das erspart
‫uns bereits das manuelle Eingeben von Fehlern oder Fehlern.
‫Alles klar, als nächstes werden
‫alle Fehler, die
‫wir mit dieser Klasse erstellen, alle Betriebsfehler sein.
‫Fehler, die wir vorhersagen
‫können, werden also irgendwann in der
‫Zukunft auftreten, wie zum Beispiel ein
‫Benutzer, der eine Tour ohne die erforderlichen Felder erstellt, oder?
‫Das ist also ein Betriebsfehler, okay, und
‫von nun an werden wir
‫hier immer diese AppError-Klasse verwenden, die
‫wir gerade erstellen,
‫um alle Fehler in unserer Anwendung zu erstellen.
‫Diese Fehler werden also Betriebsfehler sein, und was
‫ich jetzt tun werde,
‫ist tatsächlich auch eine . ist hier Betriebseigentum.
‫Also das. betriebsbereit ist, und
‫setzen Sie es auf true.
‫Bei allen unseren Fehlern wird
‫diese Eigenschaft auf "true" gesetzt, und
‫ich tue dies,
‫damit wir später auf diese Eigenschaft testen
‫und nur Fehlermeldungen für diese
‫Betriebsfehler, die wir mit dieser Klasse erstellt
‫haben, an den Client zurücksenden können.
‫Und das ist nützlich, weil
‫einige andere verrückte unerwartete Fehler in unserer
‫Anwendung auftreten können, zum Beispiel ein Programmierfehler oder
‫ein Fehler in einem der Pakete, die
‫wir in unserer App benötigen, und
‫diese Fehler werden
‫dann natürlich nicht diese haben. ist Betriebseigenschaft auf
‫ihnen, in Ordnung, und es mag
‫an dieser Stelle etwas verwirrend
‫klingen, aber keine Sorge, es
‫wird sehr viel Sinn machen,
‫wenn wir dann den gerade erwähnten Teil implementieren.
‫Also, testen dafür. ist hier Betriebseigentum.
‫In Ordnung, und jetzt ist nur
‫noch ein letzter Schritt, dass wir tatsächlich auch den Stack-Trace erfassen müssen.
‫Was meine ich nun mit Stacktrace?
‫Lassen Sie mich Ihnen das also
‫zeigen, also zeigen Sie, was Stacktrace ist, und ich
‫werde es hier in der Konsole protokollieren.
‫Konsole. Protokoll und Fehler. stackTrace,
‫also bekommt jeder einzelne Fehler diesen Stack-Trace, und
‫eigentlich ist es nur ein Stack, okay.
‫Also irr. stack wird uns im
‫Grunde zeigen, wo der Fehler aufgetreten ist.
‫Lassen Sie mich das
‫jetzt hier ausführen, und schauen wir uns
‫das an, und so sehen
‫wir hier den Fehler und dann auch, wo er passiert ist, okay?
‫Also, in diesem Fall hier
‫natürlich App hinzufügen. js in Zeile 32.
‫Also gleich hier.
‫Also, dort haben wir
‫diesen Fehler erzeugt, und so
‫ist er jetzt in unserem Stack-Trace, und er
‫zeigt uns auch den gesamten Call-Stack hier, der letztendlich in diesem Fehler entstanden ist, okay?
‫Wir wollen das
‫also irgendwie beibehalten und gleichzeitig diese Methode oder
‫diese Klasse nicht zu dieser Stack-Spur hinzufügen, okay?
‫Und das klingt wieder etwas verwirrend,
‫ich weiß, aber in diesem
‫Fall ist es nicht wirklich wichtig, es
‫zählt nur, dass wir hier einfach diese Codezeile einfügen,
‫die Error ist. capturestackTrace, also genau
‫das, was Sie hier bekommen,
‫und zuerst müssen wir das aktuelle Objekt
‫angeben, und dann die AppError-Klasse selbst, die dies sein
‫wird. Konstrukteur.
‫Okay, wenn also ein neues Objekt erstellt
‫und eine Konstruktorfunktion aufgerufen wird, wird dieser
‫Funktionsaufruf nicht im Stack-Trace
‫erscheinen und ihn nicht verschmutzen.
‫In
‫Ordnung, also legen wir es hier
‫ab, und ja, das ist also unsere AppError-Klasse, und
‫wir exportieren es jetzt tatsächlich von hier aus.
‫Also Modul. exports ist natürlich der AppError.
‫Großartig, nur eine Frage, die Sie möglicherweise haben, ist: "Warum habe
‫ich das nicht eingestellt. Nachricht gleich Nachricht? ' Nun,
‫das liegt nur daran, dass ich hier die
‫Elternklasse aufgerufen habe, richtig, und die Elternklasse
‫ist ein Fehler, und was immer wir ihr
‫übergeben, wird die Nachrichteneigenschaft sein.
‫Also genau wie ich dir schon sagte.
‫Im Grunde haben wir hier durch diesen Elternaufruf die
‫Message-Eigenschaft bereits auf unsere
‫eingehende Nachricht gesetzt.
‫In Ordnung, speichern Sie es und jetzt können wir es schließen,
‫wir brauchen es nicht
‫mehr und hier werden wir es einfach hier importieren.
‫Const AppError,
‫require,
‫und dann ist
‫es in utils, also Utilities, und appError, okay, und
‫jetzt können wir es tatsächlich verwenden.
‫Kommentieren Sie dieses Codestück aus und
‫löschen Sie tatsächlich dasjenige, das wir zuvor
‫hatten, und das
‫wird jetzt den Fehler hier im nächsten erzeugen.
‫Also, neuer AppError und dann
‫die Nachricht, die
‫diese ist, und
‫der Statuscode.
‫Richtig, und der Fehler, denk daran,
‫wird dann automatisch herausgefunden, und also lass uns das
‫alles löschen,
‫hier speichern und noch einmal diese falsche Route testen, und
‫tatsächlich erhalten wir immer noch den gleichen
‫Fehler und wir erhalten auch immer noch genau den gleichen Stack-Trace.
‫Okay, und schließlich möchte ich
‫diese Middleware auch hierher exportieren, okay?
‫Im Grunde also dieser Handler, weil
‫wir im Rest des Abschnitts ein
‫paar verschiedene Funktionen für den
‫Umgang mit verschiedenen Arten von Fehlern erstellen werden, und deshalb
‫möchte ich, dass sich
‫alle diese Funktionen in derselben Datei befinden, in Ordnung?
‫Und wir können sagen, dass alle diese
‫Funktionen, die ich gerade erwähnt habe, Handler sind,
‫okay, und daher Handler, wir nennen sie
‫im Kontext der MVC-Architektur auch Controller, und
‫lassen Sie uns
‫nun tatsächlich eine Fehler-Controller-Datei in unserem Controller-Ordner erstellen.
‫Okay, und das mag seltsam klingen oder aussehen, weil wir eigentlich keine
‫Fehlerquelle haben, okay, und daher werden mir wahrscheinlich einige
‫Leute nicht zustimmen, dass dies der richtige Ort
‫ist, aber ich persönlich mache
‫es gerne so, weil bei Am Ende
‫des Tages, diese
‫Funktionen sind sozusagen wirklich zur Kontrolle
‫unserer Fehler, in Ordnung, und so macht
‫es zumindest für mich Sinn, diese
‫Funktion hier einfach als Fehler-Controller zu bezeichnen, und hier wollte ich
‫diese Middleware-Funktion einfügen , aber ich glaube, ich habe es
‫nicht kopiert, also machen wir das noch einmal.
‫Alles klar, und eigentlich werde ich dieses hier
‫als Modul exportieren. exports, da
‫die anderen Handle-Funktionen, die
‫wir später erstellen werden, ich
‫sie von hier aus nicht exportieren werde.
‫Sie sind also einfach nur Helfer.
‫Also Modul. exports entspricht dieser Funktion, okay?
‫Lassen Sie uns diese Konsole tatsächlich loswerden. loggen Sie sich
‫hier ein, speichern Sie es und jetzt zurück
‫in unsere App müssen wir natürlich
‫jetzt diese Middleware-Funktion hier anschließen.
‫Also, lass es uns wieder importieren
‫und ich kann es
‫nennen,
‫wie ich will, und
‫so nenne es globalErrorHandler mit
‫einem großen H,
‫und ich werde Controller und errorController benötigen.
‫Setzen Sie es hierher zurück, und jetzt für den
‫letzten Test nach dieser Umgestaltung.
‫Mal sehen, und tatsächlich
‫funktioniert noch einmal alles gut, okay?
‫Also perfekt, das war das Ziel für dieses Video,
‫bis zum nächsten.