Moderne Webanwendungen mit Node.js und Express.js

Daten persistieren mit Mongoose

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Mongoose erlaubt es, die Mongo-Datenbank von Ihrer Website aus mit einfach Konventionen ohne jegliches Datenbankwissen zu nutzen.

Transkript

Weder Node noch Express bieten mir von Haus aus Möglichkeiten, meine Daten zu persistieren. Der ideale Partner für diese Tätigkeiten ist die Datenbank Mongo. Aber auch auf diese Art von Datenbank kann ich nicht ohne Hilfe der Bibliothek Mongoose zurückgreifen. Nutze ich also die Datenbank Mongoose im Zusammenhang mit meinem Model der Anwendung, gelingt es mir Daten dauerhaft zu sichern. Wie? Genau das zeige ich Ihnen nun. Als Erstes muss ich die Abhängigkeit der Bibliothek Mongoose in meinem Projekt installieren. Mit der NPM "Install Mongoose" "--safe" hinterlege ich die Abhängigkeit zu Mongoose in meinem Projekt. Sollten bei der Installation Fehler auftreten, so kann es unter Umständen dazu führen, dass am Ende nicht die Bson-Implementierung läuft, sondern die JavaScript-Implementierung. Für den Gebrauch von Mongoose selbst macht das keinen Unterschied. Aus performancetechnischen Gründen empfiehlt es sich allerdings keine Fehler hier zu bekommen beim Kompilierungsprozess der bei der Installierung des Pakets abläuft. Ich verbinde mich zuerst einmal mit der Datenbank innerhalb meiner app.js-Datei. Ich füge also hier eine zusätzliche Abhängigkeit zu Mongoose ein und initialisiere dann die Datenbankverbindung. Ich referenziere meinen lokalen Rechner, die Datenbank "Test" und den Benutzer "Test" mit dem Passwort 1234. Die Datenbank "Test" befindet sich auch in dieser Form bereits auf meiner Mongo-Datenbank. Der User "Test" ist entsprechend angelegt worden. Wenn ich nun die Anwendung starte, sollte ich keinen Fehler erhalten. Um meine Posts und Kommentare nun zu sichern, muss ich ein Model etablieren. Dafür erstelle ich ein Verzeichnis mit der Bezeichnung "Models" und erstelle hier eine Post.js. Ich deklariere zunächst meine Abhängigkeit zu Mongoose und definiere nun ein sogenanntes Mongoose-Schema. Ich bezeichne es mit der Variablen Posts, Scema oder auch Schema und deklariere nun die Attribute mit ihren jeweiligen Typen: ID ist eine Nummer, Title ein String, Description ein String - und wichtig - Kommentare ist ein Array von Strings, also mehrere Strings. Aus einem Schema kann ich mir dann ein Model erzeugen mit der Bezeichnung, die dann in der Datenbank persistiert wird. Aus guten Gründen möchte ich unter Umständen initial einige Daten in die Datenbank schreiben, damit die Collection an sich nicht leer ist. Ich suche also innerhalb des Datenbankmodels nach allen aktuell existierenden Posts. Ist die Anzahl größer als Null, verarbeite ich hier nichts mehr weiter, gibt es allerdings noch keine Posts, lege ich diese nun mithilfe des Models und dem Befehl "new" und dem anschließenden Persistieren an. Sollten also keine Posts vorliegen, werden diese beiden Posts in die Datenbank geschrieben. Zu guter Letzt muss ich noch mein Module deklarieren und "Post" nach außen hin bereitstellen. Als nächstes kann ich nun aus meinem Controller "Posts.js" das Model entfernen und durch das neu erzeugte Model austauschen. Ich referenziere also entsprechend das Modul und muss nun damit umgehen, dass das Model nicht mehr eine einfache JSON-Objektliste ist, sondern ein Modul, mit dem ich arbeiten muss. Ich nutze also Posts, die Methode Find von Posts, sortiere nach der ID und zu guter Letzt handelt es sich hierbei um eine asynchrone Anwendung, das heißt, ich muss hier eine Exec-Funktion deklarieren, die sich darum kümmern wird, dass Einträge gefunden werden oder ein Fehler zurückgegeben wird. Aktuell hat es sich dabei um einen synchronen Aufruf gehandelt, daher muss ich nun eine Änderung vornehmen, die demjenigen, der diesen Controler benutzt, die Möglichkeit gibt, einen Callback zu spezifizieren, in dem ich das Resultat mitgeben kann. Immer dann, wenn also kein Fehler vorliegt, nutze ich die Callback-Funktion und gebe die Posts zurück, liegt ein Fehler vor, gebe ich einen Null-Wert zurück. Beim Speichern von Kommentaren gehe ich ähnlich vor. Ich tausche die bisherige Implementierung aus, ich suche innerhalb von Posts nach etwas mit der ID, die entsprechend in der Funktion übergeben wurde. Sollte ich den Post bekommen, immer dann greife ich auf die Kommentare zurück, speichere den neuen Kommentar aus der Variablen "Comment" und sichere das Objekt in der Datenbank. Sollte ich einen Fehler erhalten, gebe ich diesen Fehler zurück. Zusätzlich muss ich hier also noch eine Callback-Methode anbieten, bei der ich unter Umständen auch darauf verzichten kann, dass der Nutzer der Controler-Funktion einen Callback anbietet. Ist dieser also nicht deklariert, wird der Callback nicht ausgeführt. In meiner Route muss ich nun damit umgehen, dass die Antwort nicht mehr unmittelbar vom Controller zurückkommt, also direkt im JSON-Objekt deklariert werden kann. Ich deklariere also nun den Aufruf von GetPosts mit einer Callback-Methode, die die Posts entgegennimmt und dann an die Renderfunktion übergibt. So wird erst nach Antwort der Datenbank an den Browser zurückgespielt, welche Inhalte vorliegen. Wenn ich die Anwendung nun starte, kann ich in Robomongo beobachten, dass in der Collection "Posts" zwei Objekte erzeugt worden sind mit den jeweiligen initialen Inhalten. Beim Aktualisieren der Posts-Seite erhalte ich glücklicherweise schon mal keinen Fehler. Wenn ich nun etwas hineinschreibe, wie "Google", scheint das offensichtlich gespeichert zu werden. Um wirklich sicher zu gehen, starte ich den Server nun neu. Das Benutzen des Refresh-Buttons verrät mir, ob ich erfolgreich war oder nicht und die Daten sind erhalten geblieben und in der aktuellen Form auch in der Datenbank zu finden. Mittels Mongoose habe ich nun Node mit meiner Mongo-Datenbank verknüpft. Dafür habe ich ein JSON-Schema deklariert und automatisch wurden von Mongoose alle Create-, Read-, Update- und Delete-Methoden erzeugt, das heißt, alle Operationen auf der Datenbank mussten von mir nicht zusätzlich implementiert werden. Man verbindet sich direkt beim Start der Anwendung einmalig mit der Datenbank. Diese Verbindung gilt dann für alle anderen Operationen mit Mongoose. In meinem Model habe ich initiale Seed-Daten eingetragen und musste noch entsprechende Anpassungen für die asynchronen Antworten der Datenbank umsetzen.

Moderne Webanwendungen mit Node.js und Express.js

Entwickeln Sie auf der Open-Source-Plattform Node.js kompakte und performante Webapplikationen und lernen Sie weiterführende Konzepte professioneller Webentwicklung kennen.

2 Std. 20 min (24 Videos)
Derzeit sind keine Feedbacks vorhanden...
Exklusiv für Abo-Kunden
Erscheinungsdatum:23.03.2015

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!