‫Kursleiter: Genau wie
‫Express hat auch Mongoose das Konzept der Middleware.
‫Lassen Sie uns nun etwas über
‫die erste Art von Middleware lernen, die Dokument-Middleware.
‫Jetzt können wir, genau wie bei Express,
‫die Middleware von Mongoose verwenden, um zwischen zwei
‫Ereignissen etwas zu bewirken.
‫Beispielsweise können wir jedes Mal, wenn ein
‫neues Dokument in der Datenbank gespeichert
‫wird, eine Funktion zwischen dem Speichern-Befehl und dem eigentlichen
‫Speichern des Dokuments oder auch nach dem eigentlichen Speichern ausführen.
‫Aus diesem Grund wird die Middleware
‫von Mongoose auch als Pre- und Post-Hooks bezeichnet.
‫Also wieder, weil wir Funktionen definieren können, die
‫vor oder nach einem bestimmten Ereignis ausgeführt werden, wie zum Beispiel
‫das Speichern eines Dokuments in der Datenbank.
‫Middleware ist also ein absolut grundlegendes Konzept in Mongoose,
‫also genau wie in Express.
‫Und es gibt unzählige
‫Möglichkeiten und Anwendungsfälle für Middleware, und wir
‫werden in diesem Projekt ständig Middleware verwenden.
‫Es gibt also vier Arten von
‫Middleware in Mongoose: Dokument-, Abfrage-, Aggregat- und Modell-Middleware.
‫Und in dieser Vorlesung
‫werden wir über Document Middleware sprechen,
‫also Middleware, die auf das aktuell verarbeitete Dokument reagieren kann.
‫Genau wie die virtuellen Eigenschaften definieren
‫wir eine Middleware auf dem Schema,
‫also tourSchema. Vor.
‫Dies ist also für Pre-Middleware, die wiederum
‫vor einem tatsächlichen Ereignis ausgeführt wird.
‫Und dieses Ereignis ist in diesem Fall das Speicherereignis.
‫Also diese Callback-Funktion, die wir hier
‫als nächstes definieren
‫werden, also
‫Funktion, damit diese Funktion aufgerufen wird, bevor ein tatsächliches Dokument
‫in der Datenbank gespeichert wird.
‫Das ist also Dokument-Middleware, und sie läuft, lassen
‫Sie mich das alles hier schreiben.
‫Es wird also vor dem Speichern-Befehl und
‫der . Befehl erstellen.
‫Aber nicht auf viele einfügen.
‫Wenn wir also diesen Befehl hier verwenden, also insertMany, dann
‫wird das die Save-Middleware eigentlich nicht auslösen.
‫Behalte das also immer im Hinterkopf.
‫Es ist sehr wichtig zu wissen, dass nur beim
‫Speichern und Erstellen tatsächlich diese Middleware hier
‫ausgeführt wird.
‫Beginnen wir also mit einer einfachen Konsole. log und was
‫ich über die Konsole loggen werde, ist folgendes.
‫In einer Save-Middleware zeigt das Disk-Schlüsselwort hier
‫also auf das aktuell verarbeitete Dokument.
‫Aus diesem Grund wird sie als Document Middleware bezeichnet.
‫Auch hier, weil wir in
‫dieser Funktion hier Zugriff auf das Dokument haben, das verarbeitet wird.
‫In diesem Fall also das Dokument, das gespeichert wird.
‫Lassen Sie mich Ihnen das mit dieser Konsole nur sehr
‫schnell zeigen. Protokoll.
‫Um diese Funktion jetzt auszulösen, denken
‫Sie daran, dass wir einen Save-Befehl oder einen Create-Befehl ausführen müssen.
‫Also müssen wir jetzt mit unserer API eine neue
‫Tour erstellen, um dann diese Middleware auszulösen.
‫Also gehen wir hier zum Postboten, und ich fange damit an, diese beiden neuen
‫Routen zu speichern, die wir in den
‫vorherigen Vorlesungen erstellt haben. Holen Sie sich also einen Monatsplan.
‫Und dieser hier ist Tourstatistiken.
‫Jetzt kann ich sie schließen und eine neue Tour erstellen.
‫Und wir spezifizieren die Daten hier im Body.
‫Jetzt ist nicht alles hier wirklich erforderlich, also werfen
‫wir einen Blick darauf, was tatsächlich erforderlich
‫ist, und entfernen Sie den Rest.
‫Das ImageCover wird also
‫benötigt, die Zusammenfassung, natürlich der Preis und ja.
‫Also lasst uns das Zeug loswerden, das wir hier
‫nicht wirklich brauchen, nur um es auf ein Minimum zu beschränken.
‫Also die Bewertungen, Menge, Durchschnitt, also diese
‫sind nicht notwendig.
‫Also nenne ich das
‫hier einfach die Testtour, nur um es hier wirklich einfach zu halten.
‫Jetzt senden wir diese Anfrage und tatsächlich hat es das
‫neue Dokument erstellt und jetzt werfen wir
‫einen Blick auf unsere Konsole und sehen dieses Dokument hier.
‫Und tatsächlich, hier ist es.
‫Lassen Sie uns dies hier ein
‫wenig erhöhen und so sieht unser Dokument
‫aus, bevor es in die Datenbank gespeichert wird.
‫Und so haben wir hier BewertungenDurchschnitt und Menge,
‫die standardmäßig eingestellt sind.
‫Denken Sie daran, also 4. 5 und null, und
‫dann der Zeitstempel createdAt, und Sie können sogar die
‫virtuelle Eigenschaft sehen, die wir hier definiert haben.
‫Dies ist also wieder der Fall, bevor wir diese
‫Daten tatsächlich in der Datenbank speichern.
‫Zu diesem Zeitpunkt können
‫wir also noch auf die Daten reagieren, bevor sie dann in
‫der Datenbank gespeichert werden, und genau das werden
‫wir jetzt tun.
‫Also hier unten in unserer Middleware-Funktion.
‫Und was ich hier tun möchte, ist, für jedes
‫dieser Dokumente einen Slug zu erstellen.
‫Denken Sie also daran, wie wir im
‫ersten Abschnitt für jedes der Produkte, die wir im
‫Geschäft hatten, eine Schnecke erstellt haben.
‫Ein Slug ist also im Grunde nur eine
‫Zeichenfolge, die wir in die URL einfügen können, normalerweise basierend auf
‫einer Zeichenfolge wie dem Namen.
‫In diesem Fall erstellen wir hier einen
‫Slug basierend auf dem Tournamen.
‫Denken Sie also daran, wie wir dafür das slugify-Paket verwendet haben.
‫Und so lassen Sie uns jetzt fortfahren und das installieren.
‫In Ordnung, und während das geht,
‫lass uns weitermachen und es dann hier anfordern.
‫Also slugify verlangen.
‫Gehen wir zurück zu unserem ersten Fenster hier, eigentlich.
‫Und jetzt, hier unten, wollen wir das
‫nicht mehr an der Konsole protokollieren.
‫Aber stattdessen können wir jetzt dies sagen und daran
‫denken, dass dies das aktuell verarbeitete Dokument ist.
‫Damit können wir nun eine neue Eigenschaft darauf definieren.
‫Und genau das tue ich.
‫Also das. slug sollte slugify sein, und
‫dann nur ein String, aus dem wir
‫einen slug erstellen möchten, und das wird das sein. name und dann wollen wir auch
‫die Option übergeben, dass alles
‫in Kleinbuchstaben umgewandelt werden soll, und das
‫ist also kleiner: true, und jetzt speichere ich es ab.
‫Und eine Sache, über die wir
‫noch nicht gesprochen haben, ist die nächste Funktion.
‫Genau wie in Express haben wir auch in der mMngoose-Middleware die
‫nächste Funktion, im Grunde die nächste Middleware im
‫Stack aufzurufen, wie wir bereits wissen.
‫Jetzt haben wir in diesem Fall nur eine
‫Middleware-Funktion, weshalb wir keine Probleme hatten,
‫auch nicht als nächstes, aber das machen wir jetzt tatsächlich.
‫Und so hat jede Middleware-Funktion
‫in einer Pre-Save-Middleware Zugriff auf die nächste.
‫Das ist also genau das gleiche wie in Express, und
‫so rufen wir am Ende der Middleware next auf, und
‫das ruft dann die nächste Middleware
‫im Stack auf.
‫Versuchen wir es also noch einmal.
‫Und das wird Testtour Nummer zwei heißen.
‫Ganz einfach, an den Himmel
‫senden und warten.
‫Und jetzt ist es aus irgendeinem Grund nicht wirklich hier.
‫Mal sehen, ob wir einen Fehler bekommen haben,
‫und das haben wir tatsächlich nicht.
‫Aber der Grund, warum es nicht funktioniert,
‫ist, dass wir im Moment keinen Slug in unserem Schema haben.
‫Und denken Sie daran, dass uns dies tatsächlich schon einmal passiert ist,
‫als wir nur ein paar Felder im Schema hatten.
‫Und wenn wir einige Felder
‫definieren, die nicht im Schema waren, wurden
‫sie einfach nicht in der Datenbank beibehalten.
‫Und das Gleiche passiert jetzt hier, also
‫haben wir die Slug-Eigenschaft definiert, aber sie ist nicht in unserem Schema.
‫Und deshalb wurde es dann auch nicht in der Datenbank gespeichert, also
‫lass uns das schnell beheben und sagen wir mal,
‫oh, ich weiß nicht, es spielt keine Rolle,
‫kann es hier direkt nach dem
‫Namen einfügen, also sollte die Schnecke einfach ein String sein.
‫Und damit sollte es behoben sein.
‫Gehen wir also zurück und erstellen die Testtour Nummer drei.
‫Weil es nicht dasselbe sein kann, denn denken Sie daran,
‫dass wir keine Touren mit demselben Namen haben können.
‫Also machen Sie es noch einmal, und jetzt haben wir tatsächlich die Schneckeneigenschaft
‫genau hier und sie basiert tatsächlich auf dem Namen, wie Sie
‫hier sehen können.
‫Toll, also lass uns hierher zurückgehen und
‫das ein bisschen reduzieren.
‫Hier haben wir also die Pre-Dokument-Middleware.
‫Lassen Sie uns jetzt auch ganz schnell mit
‫einer Post-Middleware experimentieren.
‫Also tourSchema. posten und speichern wir wieder.
‫Und dann die Callback-Funktion, die bei Post-Middleware
‫nicht nur auf das
‫nächste, sondern auch auf das gerade
‫in der Datenbank gespeicherte Dokument Zugriff hat.
‫Nennen wir das ein Dokument und dann das nächste.
‫Und so werden Post-Middleware-Funktionen
‫ausgeführt, nachdem alle Prä-Middleware-Funktionen
‫abgeschlossen sind.
‫Hier drin haben wir also eigentlich nicht mehr das
‫disk-Schlüsselwort, sondern das im Grunde fertige
‫Dokument hier in doc.
‫Lassen Sie uns das fertige Dokument einfach in der
‫Konsole protokollieren und dann als nächstes aufrufen.
‫Auch in diesem Fall haben
‫wir nur eine Post-Middleware und würden die nächste also nicht wirklich
‫brauchen, aber es ist eine bewährte Methode, sie einfach immer einzuschließen.
‫Nun wollte ich Ihnen auch zeigen, dass
‫wir natürlich mehrere Pre-Middlewares
‫oder auch Post-Middlewares für denselben Hook haben können.
‫Und Hook nennen wir das hier speichern.
‫Diese Middleware hier ist also im
‫Grunde das, was wir einen Pre-Save-Hook nennen.
‫Sie werden diese Terminologie also ständig sehen.
‫Manche nennen es Middleware und manche nennen es Hooks.
‫Dies wird also ein Pre-Save-Hook
‫oder Pre-Save-Middleware sein.
‫Also Funktion, und auf diese hat man weiter Zugriff.
‫Und so lassen Sie uns hier einfach
‫etwas in die Konsole protokollieren, wie zum Beispiel das Dokument speichern.
‫Und dann als nächstes, und das sollte natürlich als nächstes kommen.
‫Nur um zu sehen, ob wir einen
‫Fehler bekommen, werde ich den nächsten hier weglassen.
‫Nur um zu sehen, was passiert, wenn wir es nicht aufrufen.
‫Also werde ich eine neue
‫Tour erstellen und am Ende dieses Vortrags
‫werde ich sie alle löschen, aber jetzt brauchen wir sie hier.
‫Und jetzt sehen Sie, dass es noch nicht wirklich fertig ist,
‫also stecken wir in dieser einen Middleware-Funktion fest, die
‫nicht den nächsten Aufruf hat.
‫Also im Grunde stecken wir hier drin fest.
‫Lassen Sie uns also
‫die Anfrage abbrechen und sie dann hierher zurückholen und
‫es erneut versuchen.
‫Und nun hat es tatsächlich funktioniert.
‫Also unser Slug ist hier, richtig, und so werfen wir
‫einen Blick auf unsere Konsole, und so
‫läuft tatsächlich auch unsere zweite Pre-Middleware, also speichert
‫die eine Protokollierung das Dokument und dann
‫protokolliert unsere Post-Middleware das endgültige Dokument auf der Konsole.
‫und so sollte das auch
‫schon die Schnecke haben und ja, hier ist sie.
‫Und das ist eigentlich alles,
‫was ich Ihnen über Document Middleware zeigen musste.
‫Jetzt werde ich diese beiden hier einfach auskommentieren,
‫weil ich mein Log hier nicht die ganze Zeit mit dieser
‫Konsole verschmutzen möchte. logs, aber ich
‫behalte sie immer noch hier
‫als Referenz.
‫Ich möchte, dass Sie sich von diesem Vortrag
‫daran erinnern, dass wir Middleware vor und nach
‫einem bestimmten Ereignis ausführen können.
‫Und im Fall von
‫Dokument-Middleware ist dieses Ereignis normalerweise das Sicherungsereignis.
‫Und dann haben wir in der Middleware-Funktion
‫selbst Zugriff auf das
‫Disk-Schlüsselwort, das auf das aktuell gespeicherte Dokument verweist.
‫Und es ist auch sehr
‫wichtig zu bedenken, dass diese Save-Middleware nur für die Save-
‫und Create-Mongoose-Methoden läuft.
‫Es wird zum Beispiel nicht für viele einfügen und
‫auch nicht für find one and update oder
‫find by ID and update laufen, die wir schon früher verwendet haben.
‫Zum Beispiel haben wir hier irgendwo
‫findByIdAndUpdate, aber das wird diese Save-Middleware
‫nicht auslösen.
‫Es ist also sehr wichtig, sich daran zu
‫erinnern, denn tatsächlich müssen
‫wir etwas später in diesem Projekt diese Einschränkung umgehen.
‫Alles klar, dies ist also
‫eine Dokumenten-Middleware zum Manipulieren von Dokumenten, die gerade gespeichert werden.
‫Als nächstes werden wir über Abfrage-Middleware sprechen.