‫Sprecher: In diesem Video werden
‫wir über die zweite Art von Mongoose-Middleware
‫sprechen, die Abfrage-Middleware.
‫Und wie der Name schon
‫sagt, ermöglicht uns die Abfrage-Middleware, Funktionen vor oder nach
‫der Ausführung einer bestimmten Abfrage auszuführen.
‫Und so fügen wir jetzt einen
‫Pre-Find-Hook hinzu, also im Grunde eine Middleware,
‫die ausgeführt wird, bevor eine Suchabfrage ausgeführt wird.
‫Also fügen wir hier einen weiteren Kommentar hinzu.
‫Dies ist also eine Abfrage-Middleware.
‫Und natürlich funktioniert es ganz ähnlich
‫wie zuvor.
‫Also das tourSchema und dann pre, und
‫hier definieren wir den Hook, der
‫"find.
‫"Also, Funktion, und wieder haben wir
‫Zugriff auf die nächste Funktion.
‫Und eigentlich fangen wir damit an, dass
‫wir es hier am Ende nennen, damit wir es nicht vergessen.
‫Okay, und Sie sehen, dass es
‫genauso aussieht wie die andere Middleware,
‫der andere Pre-Hook.
‫Der einzige Unterschied hier ist wirklich dieser
‫Find-Hook, der diese Abfrage-Middleware und
‫keine Dokument-Middleware macht.
‫Gut?
‫Der große Unterschied besteht darin,
‫dass das Schlüsselwort this jetzt auf die aktuelle Abfrage und nicht
‫auf das aktuelle Dokument
‫zeigt, da wir hier keine Dokumente wirklich verarbeiten.
‫Wir werden wirklich eine Anfrage bearbeiten.
‫Okay?
‫Und der Anwendungsfall, den wir hier machen werden, ist dieser.
‫Nehmen wir also an,
‫wir können geheime Touren in unserer
‫Datenbank haben, beispielsweise für Touren, die nur intern
‫angeboten werden, oder für eine sehr kleine VIP-Gruppe, von
‫der die Öffentlichkeit nichts wissen sollte.
‫Da diese Touren geheim sind,
‫möchten wir nicht, dass die geheimen Touren jemals in
‫den Ergebnisausgaben erscheinen.
‫Rechts?
‫Was wir also tun werden, ist ein geheimes Tour-Feld
‫zu erstellen und dann nur nach Touren abzufragen, die nicht geheim sind.
‫Gut?
‫Also, lass uns das tun.
‫Beginnen Sie, indem Sie hier hinzufügen, und lassen Sie es uns am Ende gleich machen.
‫secretTour, also sollte der Typ ein Boolean sein, und ich denke, dies
‫ist das erste Mal,
‫dass wir tatsächlich einen Boolean
‫verwenden, also wäre dies entweder wahr oder falsch.
‫Wenn es also wahr ist,
‫ist es eine geheime Tour, und wir
‫möchten nicht, dass es angezeigt wird, und standardmäßig ist es falsch.
‫Gut?
‫Und so sind die Touren im Grunde normalerweise nicht geheim.
‫Okay.
‫Als nächstes erstellen wir eine geheime Tour,
‫damit wir sie testen können, okay?
‫Nennen wir das hier also die Super Secret Tour.
‫All dies spielt
‫keine Rolle, und lassen Sie mich nur sagen, dass secretTour tatsächlich wahr ist.
‫Okay?
‫Hier speichern...
‫Und, äh, wo ist das?
‫Ja. SecretTour ist also wahr.
‫Und lass uns jetzt tatsächlich zu Compass
‫gehen und all diese anderen Touren löschen, die wir dort hatten.
‫Also, lass uns das neu laden ...
‫Und dann hätten wir hier unten...
‫Ja, diese Testtour hier, das können wir löschen.
‫Noch eine Testtour...
‫Also all diese Unordnung hier, im
‫Grunde wollen wir sie loswerden.
‫Wir bewahren die SecretTour hier nur
‫auf, damit wir jetzt damit experimentieren können.
‫Okay, und Sie sehen hier, dass secretTour auf true gesetzt
‫ist, während die anderen
‫natürlich dieses Attribut nicht haben,
‫denn als wir sie erstellt haben,
‫hatten wir die secretTour noch nicht.
‫Also, kurz bevor wir anfangen, zurück in
‫Postman, lassen Sie uns bestätigen, dass dies tatsächlich die letzte Tour
‫hier ist, und tatsächlich ist es nicht die letzte Tour, also
‫wo ist sie?
‫Oh, es ist das erste.
‫Also hier haben wir die Super Secret
‫Tour natürlich wahr gemacht.
‫Gut? Gehen wir also jetzt zurück und
‫führen wir die Abfrage wie gerade
‫am Anfang gesagt aus.
‫Denken Sie also noch einmal daran, dass dies
‫hier jetzt ein Abfrageobjekt ist, in Ordnung?
‫Und so können wir alle Methoden verketten,
‫die wir für Abfragen haben.
‫Und so fügt man hier einfach eine Find-Methode hinzu
‫und wählt dann im
‫Grunde alle Dokumente aus, bei denen secretTour nicht wahr ist, okay?
‫Also geheimTour ...
‫Und dann ist nicht gleich wahr.
‫Und ich mache es so,
‫weil die Editoren derzeit nicht auf false gesetzt sind.
‫Sie haben dieses Attribut einfach nicht.
‫Gut?
‫Okay, dann testen wir es jetzt noch einmal.
‫Und so sollte es jetzt hier weg sein.
‫Und tatsächlich ist es nicht mehr hier.
‫Okay, wir haben alle Touren, die nicht geheim sind, aber
‫nicht die geheime Tour.
‫Und ich sehe jetzt, dass
‫wir SecretTour hier tatsächlich auf false gesetzt
‫haben, aber das ist wirklich nur eine
‫Mungo-Sache, also schauen wir uns hier noch einmal Compass an und laden
‫sie neu.
‫Sie sehen also, dass secretTour in
‫der Datenbank tatsächlich nicht auf false gesetzt ist.
‫Mongoose fügt das einfach hinzu, weil wir es in unserem
‫Schema als Standard haben und es nicht in der Datenbank ist.
‫Und so ist es im Grunde genommen, es trotzdem dort zu platzieren.
‫Sie sehen also, dass wir tatsächlich 11
‫Dokumente haben, aber hier in Postman erhalten wir nur zehn Ergebnisse.
‫Und das
‫liegt natürlich daran, dass unsere Secret Tour im Grunde herausgefiltert wird.
‫Okay?
‫Versuchen wir also noch einmal zu
‫verstehen, was wirklich passiert.
‫Sobald wir diese Route erreicht haben, sehen
‫wir uns hier
‫mit der get-Methode an, was passiert.
‫Was also passiert, ist, dass wir eine Abfrage
‫mit tour erstellen. finden.
‫Okay?
‫Und dann verketten wir natürlich all diese
‫Methoden, wie wir in einer der letzten Vorlesungen
‫besprochen haben,
‫und führen diese Abfrage dann am Ende hier mit await aus.
‫Rechts? Erinnere dich daran?
‫Hier führen wir also die Abfrage aus.
‫Aber bevor sie
‫tatsächlich ausgeführt wird, wird unsere Pre-Find-Middleware hier ausgeführt.
‫Okay?
‫Und es wird ausgeführt, weil es gefunden
‫wird, genau wie wir es hier verwendet haben.
‫Rechts?
‫Wir erstellen also eine
‫Suchabfrage, und daher wird dann der Suchhook ausgeführt.
‫Da es sich hier um eine Abfrage-Middleware handelt, verweist
‫das Schlüsselwort this auf die Abfrage.
‫An diese Abfrage können wir
‫dann noch eine weitere Suchmethode verketten, oder?
‫Und dort filtern wir dann die secretTour
‫mit diesem Filterobjekt heraus.
‫Okay?
‫Also im Grunde gesagt, dass wir nur
‫Touren wollen, bei denen die secretTour nicht gleich wahr ist.
‫Und es würde eigentlich
‫genauso funktionieren, wenn wir hier einfach
‫falsch sagen würden, aber ich finde es so sauberer.
‫Okay, jetzt müssen wir nur noch eine Sache reparieren,
‫denn im Moment läuft diese
‫Middleware für find, aber nicht für find1.
‫Okay?
‫Lassen Sie mich Ihnen also das Problem zeigen, das wir damit bekommen könnten.
‫Also, äh, nehmen wir die ID der Secret Tour.
‫Wir haben also
‫die Secret Tour hier, und das ist ihre ID, und wenn wir also eine Tour
‫bekommen, dann sollte uns das die Super Secret Tour hier geben.
‫Rechts?
‫Sie sehen also, dass
‫dieser Filter, den wir gerade in die
‫Middleware eingebaut haben, für diesen Befehl nicht funktioniert.
‫Okay?
‫Und das liegt daran, dass die Handle-Funktion
‫für diese Route,
‫wie Sie sich vielleicht erinnern, findByID verwendet, das im Hintergrund
‫find1 ist und sich daher von find unterscheidet.
‫Gut?
‫Daher müssen wir dieselbe Middleware auch für find1 angeben.
‫Nun gibt es zwei
‫Möglichkeiten, dies zu tun, und die erste
‫wäre, einfach diesen Code zu kopieren und dann find1 hier einzufügen.
‫Aber das ist nicht wirklich
‫gut, und deshalb verwenden wir stattdessen einen regulären Ausdruck.
‫Und das ist ganz einfach, und so ...
‫Und lassen Sie mich das hier
‫tatsächlich duplizieren, dieses
‫Stück auskommentieren und dann denken Sie daran, ein regulärer
‫Ausdruck beginnt und endet mit einem Schrägstrich.
‫Und hier möchte ich sagen,
‫dass diese Middleware nicht
‫nur für find ausgeführt werden sollte,
‫sondern für alle Befehle, die mit dem Namen find beginnen.
‫Okay?
‫Also, find und find1 und auch find1 und delete, find1
‫und update, und
‫all dies löst nun tatsächlich diese Middleware-Funktion
‫aus, die wir hier haben.
‫Gut?
‫Das ist also nicht nötig.
‫Dieser reguläre Ausdruck hier ist viel besser.
‫Auch hier bedeutet
‫dies hier einfach alle Strings, die mit find beginnen.
‫Und tatsächlich, da wir hier sind,
‫möchte ich Ihnen die Mongoose-Dokumentationen noch einmal zeigen.
‫Wenn wir also in diesen Handbüchern auf Middleware eingehen, erhalten Sie
‫einen Überblick über die gesamte Middleware.
‫Dokument-Middleware ist
‫beispielsweise diejenige, über die wir zuvor gesprochen
‫haben und die beispielsweise beim Speichern ausgeführt wird.
‫Tatsächlich kann Dokumenten-Middleware aber
‫auch für Dinge wie Entfernen ausgeführt werden.
‫Gut?
‫Oder zum Validieren.
‫Okay, aber ich habe nicht darüber gesprochen,
‫weil normalerweise der, den wir immer verwenden, nur zum Speichern dient.
‫Jetzt kann Abfrage-Middleware für alle diese
‫Abfragefunktionen ausgeführt werden.
‫Finden Sie also, wie wir gerade angegeben
‫haben, und jetzt wird es
‫mit unserem regulären
‫Ausdruck auch für find1, findOneAndDelete,
‫findOneAndRemove und findOneAndUpdate ausgeführt.
‫Wie auch immer, wenn Sie jetzt zurück zu
‫Postman gehen, sollte dies diese Situation jetzt hier behoben haben.
‫Wenn wir diese Abfrage jetzt ausführen, sollte
‫sie keine Ergebnisse liefern.
‫Und das tut es tatsächlich nicht.
‫Denn denken Sie daran, wir versuchten, eine geheime Tour zu bekommen.
‫Die Tour mit dieser ID hier ist
‫also geheim, aber wir möchten nie, dass
‫die secretTours in einer Abfrage auftauchen.
‫Deshalb erhalten wir im Moment null Ergebnisse.
‫Okay?
‫Also das funktioniert jetzt.
‫Speichern Sie dies nicht
‫und jetzt zurück zu unserem Code.
‫Lassen Sie uns nun
‫tatsächlich auch eine Post-Middleware für find angeben.
‫Also, tourSchema, und dann, wie zuvor, post, und dann verwenden wir
‫hier wieder unseren regulären Ausdruck für
‫alles, was mit find beginnt.
‫Und dann nur eine normale
‫Funktion, und dann erhalten wir hier in
‫der Post-Find-Middleware tatsächlich Zugriff auf alle Dokumente, die
‫wir von der Abfrage zurückgegeben haben.
‫Nennen wir das also Docs.
‫Gut?
‫Denken Sie also daran, dass diese Middleware
‫ausgeführt wird, nachdem die Abfrage bereits ausgeführt wurde.
‫So kann es
‫auf die zurückgegebenen Dokumente zugreifen.
‫Auch hier, weil diese Abfrage
‫zu diesem Zeitpunkt eigentlich schon beendet ist.
‫Also loggen wir diese Dokumente in die Konsole ein,
‫also
‫docs, aber ich möchte hier auch noch etwas anderes machen.
‫Lassen Sie uns also im Grunde eine Art
‫Uhr erstellen, um zu messen, wie lange es
‫dauert, die aktuelle Abfrage auszuführen.
‫Gut?
‫Also, wie sollen wir das machen?
‫Nun, ganz einfach.
‫Wir können dem this-Objekt einfach eine Eigenschaft setzen,
‫da dieses Abfrageobjekt eigentlich nur ein normales Objekt ist.
‫Natürlich hat es Zugriff auf all diese Methoden, wie zum
‫Beispiel find, aber
‫wir können es auch
‫verwenden, um jede gewünschte Eigenschaft darauf zu setzen.
‫Also wieder nur ein normales Objekt.
‫Und hier können wir dies sagen. Start sollte
‫das aktuelle Datum sein.
‫Okay?
‫Und so wird es
‫als aktuelle Zeit in Millisekunden eingestellt, okay?
‫Und so können wir hier in der Post-Middleware,
‫die nach der Ausführung der Abfrage ausgeführt
‫wird, die aktuelle Zeit minus
‫der Startzeit subtrahieren.
‫Also trösten. log, Abfrage
‫genommen, und jetzt
‫das aktuelle Datum minus
‫diesem.
‫Start, Millisekunden.
‫Okay, speichern wir es und
‫versuchen wir nun, eine Abfrage auszuführen und unsere Ergebnisse anzuzeigen.
‫Okay?
‫Also, hier bekommen wir alle unsere Touren, hier
‫haben wir die Konsole, und
‫lassen Sie uns das eigentlich klarstellen.
‫Da ist viel Zeug drin.
‫Fordern Sie erneut
‫an, und hier sind alle Ergebnisse.
‫Im Grunde sind dies also alle gefundenen Touren, und das
‫ist das Ergebnis von Konsole. Protokoll der Dokumente.
‫Also im Grunde die Dokumente, die der Abfrage entsprachen.
‫Aber ich interessiere mich jetzt für diese erste Konsole. log, und hier
‫sehen wir "Abfrage dauerte 120 Millisekunden", und das war im Grunde
‫die Zeit, die vom Anfang,
‫wo wir dies definiert haben, bis
‫nach der Ausführung der Abfrage zu diesem Zeitpunkt verstrichen ist.
‫Gut.
‫Und das ist alles, was ich Ihnen
‫vorerst zum Thema Abfrage-Middleware zeigen
‫musste, und wie
‫zuvor werden wir dies natürlich
‫während des
‫gesamten Kurses häufig verwenden, denn wie ich
‫eingangs erwähnte, ist Middleware wirklich ein grundlegendes Konzept
‫Das ist wirklich wichtig für viele Dinge,
‫die wir in unseren Anwendungen benötigen.
‫Wir sind also fast fertig mit dem Reden über Middleware.
‫Als nächstes folgt die
‫letzte, die Aggregations-Middleware.