‫Kursleiter: In diesem Video möchte ich
‫die API-Funktionen, die wir in den letzten Vorlesungen implementiert
‫haben, ganz schnell umgestalten.
‫Dies dient nicht nur dazu, unseren Code etwas sauberer zu
‫machen, sondern auch, um ihn in Zukunft modularer und wiederverwendbarer
‫zu machen.
‫Im Moment haben wir also all diesen Code
‫für die Funktionen, die wir zuvor in dieser getALLTours-Funktion erstellt haben, richtig?
‫Und das sieht etwas chaotisch aus.
‫Es ist ein bisschen schwer zu verstehen, okay?
‫Und stellen Sie sich auch vor, wir wollten dieselben Funktionen für eine
‫andere Ressource verwenden.
‫Zum Beispiel für die Nutzer oder später für die Bewertungen.
‫Es wäre im Grunde nicht sehr praktisch, den
‫Code von hier zu kopieren und dann in
‫den anderen Ressourcen richtig zu verwenden.
‫Also erstelle ich jetzt
‫eine Klasse, in der ich für jede
‫dieser API-Features oder -Funktionalitäten, wie Sie sie auch nennen könnten,
‫eine Methode hinzufüge.
‫Gut?
‫Also, lass uns das hier machen und ich
‫werde es hier tun, für jetzt, später werde ich
‫es tatsächlich in eine eigene Datei exportieren,
‫im Grunde um ein wiederverwendbares Modul zu erstellen, das
‫wir können , später in andere Controller importieren.
‫Gut?
‫Also, Klasse, und ich nenne es APIFeatures.
‫Gut.
‫Dann beginnen wir mit unserer Konstruktorfunktion
‫und erinnern uns, dass dies
‫die Funktion ist, die automatisch aufgerufen wird, sobald
‫wir ein neues Objekt aus dieser Klasse erstellen.
‫Was will ich nun eigentlich von diesen API-Features?
‫Eigentlich werde ich hier zwei Variablen analysieren, okay?
‫Also die Mungo-Abfrage und auch der queryString, den wir von
‫Express bekommen.
‫Also, im Grunde genommen von der Route her, in Ordnung.
‫Darauf haben wir normalerweise Zugriff
‫in der req. abfragen, ok.
‫Jetzt übergebe ich die Abfrage hier wieder, weil ich
‫keine Abfrage innerhalb dieser Klasse durchführen möchte, da dies diese
‫Klasse dann an die Tourressource weiterleiten würde, aber ich
‫möchte, dass diese so wiederverwendbar wie möglich ist.
‫Gut.
‫Was wir in dieser Konstruktorfunktion normalerweise
‫tun, ist dies zu sagen. query entspricht der Abfrage, die wir als Argument
‫erhalten haben, und dann dies. queryString
‫ist gleich queryString.
‫Okay?
‫Also sehr einfache, sehr typische Konstruktorfunktion.
‫Und jetzt werde ich, wie bereits erwähnt,
‫eine Methode für jede der Funktionen erstellen, beginnend mit Filter.
‫Gut.
‫Also, lassen Sie uns jetzt fortfahren und den Code von hier aus schneiden.
‫Oder tatsächlich, ich werde es kopieren und
‫sie kommentieren es, damit ich keinen versehentlichen Schaden anrichte.
‫Also, kopiere den Kommentar
‫und füge ihn hier ein.
‫Also, ein paar Dinge, die wir ändern müssen.
‫Zuerst auf Anfrage. query wird innerhalb dieser Klasse
‫nicht verfügbar sein.
‫Aus diesem Grund haben wir den queryString tatsächlich geparst.
‫Und so wird das hier durch dieses
‫ersetzt. AbfrageString.
‫Okay?
‫Dies ist also wieder nur grundlegendes Javascript.
‫Hat eigentlich gar nichts mit Note oder Express zu tun.
‫Dann ist der Rest hier okay, aber das hier ist überhaupt nicht okay.
‫Ich möchte die Tour also nicht direkt hier abfragen, denkt daran, sondern ich
‫möchte diesen Fund jetzt einfach zu der
‫Abfrage hinzufügen, die wir bereits haben.
‫Also das. Anfrage. finden
‫und so, das wird dann das sein.
‫Gut?
‫Lass uns das jetzt loswerden.
‫Und bevor wir hier weitere Methoden hinzufügen,
‫lassen Sie uns diese Klasse verwenden, damit
‫dies für Sie sinnvoller ist.
‫Okay?
‫Also, wie soll das eigentlich funktionieren?
‫Und ich werde alles hier am Ende
‫hier unter Execute Query machen.
‫Gut?
‫Also kann ich jetzt zum Beispiel eine
‫Variable namens Features erstellen.
‫Und dann erstelle ich von hier aus ein neues API-Feature-Objekt.
‫Okay?
‫Im Grunde also das Erstellen einer Instanz dieser API-Features,
‫die dann in Features gespeichert werden.
‫Und hier haben wir dann Zugriff auf
‫alle Methoden, die wir in der Klassendefinition definieren werden.
‫Okay?
‫Denken Sie also daran, dass wir hier eine Abfrage und
‫den queryString übergeben müssen.
‫Also, die Abfrage, wie erstellen wir eine?
‫Denken Sie daran, es ist Tour. finden.
‫Es gibt also ein Abfrageobjekt und das ist dasjenige, das
‫wir in diese Klasse geparst haben und dann natürlich
‫den queryString, der req ist. Anfrage.
‫Okay, zu diesen Funktionen hier, denken Sie daran, dass
‫wir keinen Zugriff auf Filter haben.
‫Und so lassen Sie es uns im Nachhinein gleich hier setzen.
‫So, . Filter.
‫Sparen Sie.
‫Und so werden
‫wir die API-Filterfunktionalität ausführen oder codieren.
‫Dann funktioniert hier die nächste Zeile
‫natürlich nicht, weil diese Abfrage hier
‫nicht mehr existiert.
‫Stattdessen haben wir jetzt Funktionen. abfragen, oder?
‫Also nach all dieser Verarbeitung jetzt im Grunde.
‫Okay, also jetzt, nach diesem Filter, das hier. query enthält
‫dann diese neue find-Methode.
‫Okay, und das wird dann wieder in diesem gespeichert. Anfrage.
‫Und später werden wir all diese anderen Methoden haben, die
‫alle dies manipulieren. Abfrage, damit
‫am Ende dies. query ist die
‫Abfrage, die wir ausführen möchten.
‫Also genau wie hier.
‫Okay, genau wie hier haben wir die Abfragevariable
‫immer manipuliert.
‫Wir fügten ihm immer mehr Methoden hinzu,
‫bis wir es dann am Ende ausgeführt haben.
‫Und hier machen wir genau dasselbe.
‫Wir verschieben den Code einfach in all diese Methoden.
‫Okay?
‫Am Ende wird die Abfrage dann, wie gesagt,
‫in dieser Eigenschaft hier gespeichert und so, ja, dort warten
‫wir dann und erhalten
‫die Ergebnisse zurück.
‫Gut?
‫Wie auch immer, lassen Sie uns hier weitermachen und die Sortierung implementieren.
‫Also kopiere und kommentiere ich.
‫Also, filtern und das nächste heißt Sortieren.
‫Gut.
‫Und so müssen wir auch hier die Anfrage ersetzen. mit diesem
‫abfragen. queryString, okay.
‫Und dann ist Abfrage jetzt das. Anfrage.
‫Also lass uns diese vier hier reinbringen. Anfrage.
‫Okay, das Ziel hier ist es,
‫diese Methoden hier im Grunde nacheinander zu verketten.
‫Also lass mich dir das hier zeigen.
‫Wir haben also Filter und danach wollen
‫wir die Sortiermethode verketten.
‫Im Moment wird das nicht wirklich
‫funktionieren, denn wo ketten wir diese Art eigentlich an?
‫Im Grunde versuchen wir es also auf das Ergebnis zurückzuführen,
‫aber was ist jetzt das Ergebnis?
‫Nun, es ist nicht wirklich etwas,
‫weil diese Filtermethode hier nichts zurückgibt, oder?
‫Nun, dieser Code hier gibt
‫natürlich das soeben erstellte Objekt zurück, und
‫wir können die Filtermethode darauf verketten.
‫Aber die Filtermethode wiederum gibt nichts zurück.
‫An diesem Punkt können wir das Objekt also nicht
‫wirklich sortieren, oder?
‫Die einfache Lösung dafür, und
‫vielleicht haben Sie dies schon einmal in Ihrem Code getan, besteht
‫darin, dass wir dies jetzt zurückgeben müssen.
‫Also, gib das zurück und das ist einfach das gesamte Objekt, okay?
‫Und das gleiche dann hier unten.
‫Also, gib das zurück.
‫Um wieder das gesamte Objekt zurückzugeben, das dann natürlich Zugriff
‫auf diese anderen Methoden hat, damit wir sie
‫dann dort aufrufen können.
‫Gut?
‫Als nächstes steht also die Begrenzung an.
‫Und ich werde das hier limitFields nennen.
‫Und das liegt daran, dass
‫alle diese Methoden diese Verben als Namen haben.
‫Es heißt also filtern, sortieren, begrenzen, und die Paginierung
‫ist die nächste.
‫Also wieder req. Abfrage ist jetzt das. queryString und query
‫here ist jetzt das. Anfrage.
‫Gut?
‫Senden Sie dies zurück und dies ist nicht korrekt.
‫Okay, und schließlich die Paginierung.
‫Kopieren, kommentieren.
‫Also, paginieren.
‫Geben Sie dies zurück und natürlich müssen
‫wir diese Anforderungen ersetzen. diese abfragen.
‫AbfrageString.
‫Und dann wird es hier, genau
‫wie zuvor, so sein. Anfrage.
‫Und mir ist gerade klar geworden, dass wir
‫das hier oben, gleich bei der ersten Methode, nicht gemacht haben.
‫Also haben wir das einfach gesagt. Abfrage und
‫fügte dort den Fund hinzu.
‫Aber dann müssen wir
‫es natürlich in dieser Abfrageeigenschaft speichern.
‫Okay, und das habe ich vergessen.
‫Und wir haben hier einen Fehler.
‫Okay, das spielt hier im
‫Moment keine Rolle.
‫Oder tatsächlich, weil diese Codezeile hier tatsächlich
‫in unserer paginate-Methode enthalten ist.
‫Also lass uns dorthin gehen.
‫Und eigentlich wollte ich hier mit
‫Ihnen darüber sprechen.
‫Denn wenn Sie darüber nachdenken, ist das Anfordern
‫der nächsten Seite, die kein Ergebnis hat, kein wirklicher Fehler.
‫Die Tatsache, dass keine Ergebnisse vorliegen, reicht für
‫den Nutzer aus, um zu erkennen, dass die aufgerufene Seite
‫grundsätzlich keine Daten enthält.
‫Wir brauchen in dieser Situation also nicht wirklich einen Fehler.
‫Und so werde ich einfach weitermachen und diesen ganzen Code löschen.
‫Okay?
‫Also lass es mich jetzt hier speichern.
‫Damit ist der Fehler jetzt natürlich weg.
‫Und auch hier müssen wir diese anderen
‫Methoden noch immer hinzufügen.
‫Also limitFields und . paginieren.
‫Speichern Sie es und denken Sie noch einmal daran, dass diese ganze
‫Verkettung hier nur funktioniert, weil wir
‫nach dem Aufrufen jeder dieser Methoden immer dies zurückgeben.
‫Und dies ist das Objekt selbst, das Zugriff auf jede
‫dieser Methoden hier hat, wodurch es möglich
‫ist, sie so zu verketten, wie wir es hier haben.
‫Okay, um es noch
‫einmal zusammenzufassen: Wir erstellen ein neues Objekt der API-Feature-Class.
‫Darin analysieren wir ein Abfrageobjekt
‫und die Abfragezeichenfolge, die von Express kommt.
‫Okay?
‫Dann manipulieren wir in jeder dieser vier
‫Methoden hier, die wir nacheinander aufrufen, im Grunde die Abfrage.
‫Wir fügen ihr immer mehr Methoden hinzu, genau wie wir
‫es hier oben getan haben, bevor wir diese Umgestaltungen vorgenommen haben, richtig.
‫Wir fügen der Abfrage hier also bis zum Ende weitere
‫Dinge hinzu und warten dann am Ende einfach auf
‫das Ergebnis dieser Abfrage, damit sie mit allen
‫ausgewählten Dokumenten zurückkommen kann, okay?
‫Und diese Abfrage lebt jetzt bei Features,
‫die dieses Objekt hier sind.
‫Also Funktionen. Anfrage.
‫Okay, ich hoffe das macht Sinn.
‫Bevor wir also etwas anderes tun, gehen wir zurück zu Postman
‫und probieren es tatsächlich aus.
‫Und wir können es gleich hier mit dieser Top-5-günstigen
‫Route ausprobieren, weil sie
‫hinter den Kulissen alle diese API-Funktionen verwendet, richtig.
‫Also, wenn ich es schicke, funktioniert es immer noch.
‫Das ist also fantastisch.
‫Also schließen wir es und lassen Sie mich es hier speichern.
‫Holen Sie sich also die fünf günstigsten Touren.
‫Und ja, ich werde es am Ende dabei belassen.
‫Und jetzt, gerade hier, lassen Sie uns einige Tests durchführen.
‫Entfernen Sie beispielsweise die Sortierung, lassen Sie mich das Limit verlassen.
‫Schwierigkeit, Dauer, Preis.
‫Also lasse ich das alles hier,
‫nur um zu sehen, ob es noch funktioniert.
‫Und es sieht so aus, als ob alles noch funktioniert, richtig.
‫Dies sind also genau die gleichen Ergebnisse, die
‫wir vor unserem Refactoring erhalten haben.
‫Also super, perfekt.
‫Das hat funktioniert und so löschen wir jetzt
‫tatsächlich den ganzen Code von hier, der unseren Route-Handler
‫so viel sauberer macht, nicht wahr?
‫Also, das ist so viel besser, wirklich, es ist Tag und Nacht.
‫Okay?
‫Der nächste Schritt besteht nun darin,
‫diesen ganzen Code zu nehmen, ihn auszuschneiden und in eine neue Datei,
‫also im Grunde ein neues Modul, zu legen.
‫Okay, und dafür werde ich hier einen neuen Ordner
‫erstellen, den ich Utils nenne.
‫Das steht also im Grunde für Versorgungsunternehmen.
‫Und ich werde hier im weiteren Verlauf des Kurses
‫ein paar Dinge hinzufügen.
‫Okay?
‫Dieser wird
‫also APIFeatures heißen. js und mit einem großen F hier.
‫Gut?
‫Also, hier geht unsere Klasse und am Ende
‫machen wir ein Modul. Exporte dieser Klasse.
‫Also an dieser Stelle nichts Neues.
‫Speichern Sie es, schließen Sie es,
‫und jetzt können wir es hier drinnen anfordern.
‫Const APIFeatures erfordern dann.
‫Dann müssen wir einen Ordner
‫nach oben verschieben, dann in Utils und APIFeatures.
‫Okay?
‫Noch ein Test.
‫Und es dauert einige Zeit, und los geht's.
‫Schön, das ist wirklich einfach schön.
‫Wenn wir jetzt erneut eine andere Ressource erstellen, zum
‫Beispiel für die Benutzer, ist es
‫so einfach, dieselbe Funktionalität einzufügen.
‫Alles, was wir tun müssen, ist, diese Datei anzufordern und dann
‫im Grunde dasselbe wie hier zu tun.
‫Oder vielleicht möchten wir in
‫diesem Fall nicht einmal diese Sortierfähigkeit oder
‫die Filterfähigkeit haben, und dann müssen wir
‫nur diese Codezeile herausnehmen.
‫Und dann, wie von Zauberhand, werden
‫nur diese drei
‫Funktionen oder diese drei Funktionen ausgeführt, okay.
‫Und das ist wirklich großartig.
‫Ich hoffe, Sie können den
‫Wert davon erkennen und, ja, ich bin wirklich zufrieden mit diesem Ergebnis.