‫Kursleiter:
‫In diesem Video werden wir eine Handler-Factory-Funktion
‫erstellen, um Überprüfungsdokumente, aber auch
‫Dokumente aus allen anderen Sammlungen mit einer
‫einfachen Funktion zu löschen.
‫Wie ich gleich zu Beginn dieses Abschnitts erwähnt habe,
‫wird das Hinzufügen sehr ähnlicher Handler zu allen unseren
‫Controllern also viel doppelten Code erzeugen, oder?
‫Denn all diese Update-Handler
‫oder all diese
‫Delete-Handler oder all diese
‫Create-Handler sehen im Grunde alle gleich aus, oder?
‫Stellen Sie sich auch
‫vor, wir wollten einen https-Statuscode oder eine Statusmeldung ändern.
‫Dann müssten wir in jeden einzelnen Controller gehen und
‫dann alle Handler darin ändern.
‫Warum also nicht einfach eine Factory-Funktion erstellen, die
‫diese Handler für uns zurückgibt, anstatt all
‫diese Handler manuell zu schreiben?
‫Eine Fabrikfunktion ist also genau das.
‫Es ist eine Funktion, die eine andere Funktion zurückgibt,
‫und in diesem Fall unsere Handler-Funktion.
‫Also zum Löschen, zum Erstellen, zum Aktualisieren und
‫auch zum Lesen von Ressourcen.
‫Okay, und ich weiß, dass dieses ganze Konzept ein bisschen komplex sein kann, um den
‫Kopf herumzureißen, und das
‫ist der Grund, warum ich dies
‫für den späteren Teil dieses Kurses aufgegeben habe.
‫Aber jetzt glaube ich, dass Sie tatsächlich
‫bereit sind, diese Art von Dingen zu implementieren.
‫Diese Art von Logik sollte also
‫jeder fortgeschrittene JavaScript-Entwickler implementieren können, und daher glaube
‫ich wieder, dass Sie an diesem Punkt des
‫Kurses wirklich bereit sind, ein fortgeschrittenes Konzept wie dieses
‫zu verwenden, in Ordnung.
‫Aber genug geredet, lassen Sie mich Ihnen jetzt zeigen,
‫wie es tatsächlich funktioniert, indem Sie den Delete-Handler als erstes Beispiel verwenden.
‫Und so haben wir tatsächlich eine im Tour-Controller, und
‫wir können diese kopieren, also
‫Tour löschen.
‫Okay, also habe ich es im Grunde genommen
‫als Vorlage für uns kopiert.
‫Erstellen wir also eine neue Datei, und ich werde das in
‫den Controllern tun.
‫In
‫Ordnung, also Handler...
‫Fabrik. js.
‫Und ich mache das im Controller-Ordner, weil
‫die Funktionen, die wir hier schreiben,
‫im Grunde Controller zurückgeben.
‫Daher macht es für mich sehr viel Sinn,
‫dass Sie sie hier platzieren.
‫Lassen Sie uns diesen Teil also
‫einfach hier kopieren, um ihn als Referenz zu behalten.
‫Das Ziel hier ist also wieder, im Grunde eine Funktion zu
‫erstellen, die dann eine
‫Funktion zurückgibt, die wie diese hier aussieht.
‫Aber natürlich nicht nur für die Tour,
‫sondern für jedes einzelne Modell, das wir in unserer Anwendung haben
‫und das wir vielleicht in Zukunft haben werden.
‫Diese Funktion muss also darauf
‫vorbereitet werden, und das bedeutet, dass wir innerhalb der Factory-Funktion
‫das Modell übergeben werden, in Ordnung.
‫Nennen wir dies also deleteOne.
‫Und es heißt wieder so, denn
‫diese Funktion wird nicht nur
‫zum Löschen von Touren funktionieren,
‫sondern auch zum Löschen von Bewertungen und Benutzern und
‫in Zukunft einige andere Dokumente, die wir
‫möglicherweise auch haben.
‫Wie ich eingangs sagte,
‫übergeben wir das Modell an diese Funktion.
‫Also übergeben wir das Modell und erstellen dann eine neue Funktion, und diese
‫Funktion wird sofort unsere asynchrone
‫Funktion zurückgeben, also im Grunde die gesamte oder
‫asynchrone Handlerfunktion.
‫Okay, und jetzt müssen wir nur
‫noch vom spezifischen Werkzeugmodell zum allgemeineren Modell wechseln.
‫Dann werden wir hier auch dies von Tour auf das Dokument ändern, da
‫wir wiederum nicht wissen, was das für ein Dokument ist.
‫Diese Funktion weiß also nicht wirklich, ob es sich um eine
‫Tour, eine Rezension oder einen Benutzer handelt.
‫Und so müssen wir die Tour aus all dem herausnehmen, und
‫das ist es tatsächlich.
‫Das ist also im Grunde die
‫Verallgemeinerung dieser speziellen Funktion, die nur für Touren funktioniert hat, und
‫jetzt funktioniert diese neue für jedes Modell.
‫Was wir hier auch tun müssen, ist dieses catchAsync und auch diesen
‫AppError zu importieren.
‫Also catchAsync...
‫und ich glaube, es ist im Utilities-Ordner.
‫Und dann nicht AppError, sondern catchAsync.
‫Dann duplizieren Sie
‫dies hier, AppError, und dies hier ist in Großbuchstaben.
‫Speichern Sie es und wir sind jetzt bereit,
‫dies tatsächlich zu testen.
‫So wird es funktionieren.
‫Zuerst müssen wir diese Handler-Factory importieren.
‫Sagen wir,
‫und ich nenne es hier einfach Fabrik.
‫Also require, und es befindet sich im selben Ordner,
‫also handlerfactory.
‫In Ordnung und kommentieren wir das hier aus, oder eigentlich
‫nicht alles.
‫Ja, oder eigentlich können wir es auskommentieren,
‫und damit die neuen Exporte. löscht Tour wird...
‫Fabrik. deleteOne und übergeben Sie dann das Modell,
‫das Tour ist.
‫Und das ist alles, was wir tun müssen.
‫Um es hier noch einmal kurz
‫zusammenzufassen, rufen wir diese Funktion deleteOne
‫auf, übergeben dort das Modell,
‫und was passiert, ist, dass diese Funktion
‫dann sofort diese Handlerfunktion zurückgibt, die wir
‫zuvor hatten.
‫Nur das spezifische Modell, das vorher die Tour war, wird
‫jetzt durch das ersetzt, das wir an
‫die Funktion übergeben haben.
‫Und das funktioniert übrigens aufgrund von JavaScript-Closings, was nur
‫eine schicke Art zu sagen ist,
‫dass diese innere Funktion hier Zugriff auf die
‫Variablen der äußeren Funktion erhält,
‫auch wenn die äußere bereits zurückgekehrt ist.
‫Der Aufruf dieser Funktion hier liefert
‫dann eine andere Funktion zurück,
‫die dann hier sitzt und wartet, bis sie endlich
‫aufgerufen wird, sobald wir die entsprechende Route treffen.
‫Und so versuchen wir es jetzt genau.
‫Also Tour löschen,
‫okay, und lass uns eine Tour
‫auswählen, die wir hier jetzt nicht wirklich brauchen.
‫Sagen wir also...
‫Sagen wir jetzt hier The Snow
‫Adventurer, weil es auch noch keine Bewertungen hat.
‫Senden wir das, oh, und
‫jetzt haben wir keine Berechtigung, die Aktion auszuführen, und
‫das liegt daran, dass wir nicht als Administrator angemeldet sind.
‫Versuchen wir das also,
‫und das ist der Admin, bei dem wir eingeloggt sein müssen.
‫Okay, das ist erledigt.
‫Und so sollte das jetzt funktionieren, und es hat tatsächlich funktioniert.
‫Und das ist der Beweis dafür, dass unsere Fabrikfunktion
‫wirklich ihren Job macht.
‫Okay, denn wenn du jetzt hierher zurückkommst,
‫hatten wir 10 Ergebnisse und sollten jetzt nur noch neun bekommen,
‫also perfekt.
‫Und nun ist es das Ziel, dies in jedem
‫einzelnen Controller nutzen zu können.
‫Also lass uns das hier kopieren und
‫zu den Bewertungen gehen.
‫Ach und natürlich brauchen
‫wir das hier oben, gleich am Anfang, jetzt
‫gleich, und so jetzt exportieren. deleteReview ist gleich
‫Factory. deleteOne
‫mit dem Review-Modell.
‫Und das ist alles, was
‫wir tun müssen, um den Delete-Handler zu implementieren.
‫Nun müssen wir natürlich auch noch den Routenhandler angeben.
‫Jetzt müssen wir natürlich die Route selbst angeben, und
‫das machen wir auch hier.
‫Also Router. route, da wir
‫hier tatsächlich den ID-Parameter benötigen.
‫Und jetzt ist delete einfach reviewController. deleteReview, und ich mache hier weder mit
‫der Berechtigung noch mit der Authentifizierung herum, denn im
‫Moment möchte ich das nur
‫zum Laufen bringen und mich etwas
‫später in diesem Abschnitt um diese Dinge kümmern.
‫Okay, also lass uns das Zeug hier schließen.
‫Holen Sie sich also
‫alle
‫Bewertungen, in Ordnung, speichern wir diese und auch diese.
‫Damit wir jetzt hier mit einem leeren Blatt
‫beginnen können und zunächst alle Bewertungen einholen,
‫damit wir jetzt eine löschen können.
‫Und so löschen wir, nun, nur diesen.
‫Okay, jetzt brauchen wir natürlich auch
‫dies und dann die Methode delete http.
‫Zu diesem Zeitpunkt benötigen wir keine Autorisierung,
‫also senden wir sie einfach.
‫Und zwar kein Inhalt, also 204.
‫Und wenn wir jetzt alle Bewertungen
‫bekommen, dann sollten wir wieder nur drei haben.
‫Ja, das funktioniert und kommen wir zum nächsten.
‫Okay, Bewertungen, Bewertungen.
‫Holen wir uns diese Codezeile hier und fügen sie nun
‫endlich auch dem Benutzer-Controller hinzu.
‫In Ordnung, und natürlich all das, ich verstehe, dass es jetzt
‫ein bisschen verwirrend ist, mit all diesen verschiedenen Dateien
‫herumzuspielen, aber wir müssen es
‫nur einmal machen und dann sind wir mit all
‫der Verwirrung fertig.
‫Hier hatten wir also schon den Export. deleteUser,
‫jetzt müssen wir nur noch unsere Factory-Funktion aufrufen, also
‫deleteOne und dann den Benutzer.
‫Nur der Administrator sollte später Benutzer
‫tatsächlich löschen können, denn wenn der Benutzer
‫sich selbst löscht,
‫werden sie nicht wirklich gelöscht, sondern
‫nur aktiv auf false gesetzt.
‫Aber der Administrator auf der
‫anderen Seite wird den Benutzer wirklich effektiv aus der
‫Datenbank löschen können.
‫Aber noch einmal, wir
‫werden uns etwas später um diese Berechtigungssachen kümmern.
‫Lassen Sie uns zunächst in den userRoutes überprüfen, ob
‫die Route tatsächlich implementiert ist,
‫und ja, sie ist hier unten.
‫Und da wir dies nun
‫implementiert haben, testen wir es auch hier noch einmal auf Postman.
‫Also speichern wir zuerst dieses hier.
‫So...
‫Bewertung löschen, und jetzt
‫kopieren wir dies einfach in eine
‫weitere Route.
‫Also löschen und dann einen User,
‫aber das mache ich jetzt eigentlich nicht wirklich.
‫Ich will nur eine zufällige ID.
‫Oder erstellen wir einfach einen neuen Benutzer,
‫registrieren Sie sich also und löschen Sie diesen sofort.
‫Also hallo, so.
‫Holen Sie sich alle Benutzer, und dann ist dieser Typ hier.
‫Und so löschen wir ihn gleich, also senden
‫wir, wir bekommen 204 keinen Inhalt.
‫Und jetzt sollte er natürlich weg sein.
‫Wenn wir nun versuchen, sie erneut zu
‫sehen, also im Grunde genommen versuchen, einen Benutzer zu
‫löschen, der nicht mehr vorhanden ist, sollten wir eine Fehlermeldung erhalten.
‫Werfen wir also einen Blick darauf, und tatsächlich wurde kein Dokument
‫mit dieser ID gefunden.
‫Und das bedeutet, dass in unserer
‫Factory-Funktion, also genau hier, der AppError und der catchAsync, alles
‫noch intakt ist.
‫Es funktioniert also immer noch alles wie zuvor.
‫Das war jetzt auch wichtig, hier zu testen.
‫Lassen Sie uns das auch hier
‫schnell speichern, also füge ich jeden einzelnen Endpunkt, den wir
‫implementieren, auch hier in
‫Postman hinzu, weil wir dann etwas später tatsächlich
‫in der Lage sein werden, eine API-Dokumentation
‫basierend auf allen zu erstellen das haben wir hier in Postman gespeichert.
‫Das ist also eine weitere praktische Funktion dieser Anwendung.
‫Wir haben also den aktuellen
‫Benutzer löschen, und das ist wiederum anders als nur
‫den Benutzer zu löschen, da dieser hier für
‫die Verwaltung und dieser für den derzeit angemeldeten Benutzer ist,
‫also sehr unterschiedlich.
‫Okay, das war also unsere erste Factory-Funktion nur
‫zum Löschen und nur damit Sie das
‫Konzept selbst verstehen.
‫Als nächstes implementieren wir dann Factory-Funktionen
‫zum Aktualisieren und zum Erstellen von Dokumenten.