Serie: Einführung in den MEAN Stack
- Teil 1: Definition des MEAN Stacks
- Teil 2: Setup des MEAN Stacks
- Teil 3: Node.js
- Teil 4: npm
- Teil 5: Connect
- Teil 6: Express
- Teil 7: MongoDB
- Teil 8: Mongoose
- Teil 9: REST
- Teil 10: Baucis
- Teil 11: Bower
- Teil 12: AngularJS
- Teil 13: Restangular
Mongoose ist ein Framework, welches auf dem nativen MongoDB-Driver aufsetzt und diesen um umfangreiche Modelfunktionen erweitert. Wir greifen das Beispiel aus dem letzten Kapitel erneut auf und formulieren es so um, dass wir mehr Struktur in unsere Dokumente erhalten.
Die Grundlage von Mongoose sind Schemas, welche eine abstrakte Beschreibung zu den Dokumenten in einer Collection darstellen. Mit Schemas können Felder in einem Dokument auf einen Typ geprüft, eingehende Daten validiert und Defaultwerte zugewiesen werden. Auch die Verwendung von virtuellen Feldern, die zwar vom Server benutzt werden können, aber nicht in der MongoDB-Datenbank gespeichert werden sollen, sind möglich. Ein weiteres Feature sind frei definierbare Hooks, spezielle Funktionen, die vor oder nach einem Event (wie dem Speichern eines Dokumentes) ausgeführt werden. Wie ihr seht ist Mongoose recht umfangreich. Die vollständige Dokumentation findet ihr hier.
Mongoose wird über npm installiert. Die aktuellste Version zum Zeitpunkt des Schreibens ist 3.6.2.
$ npm install mongoose
Unser voriges Beispiel umgeschrieben mit Mongoose sieht so aus:
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/first-db');
var VisitSchema = new mongoose.Schema({
url: String,
time: { type: Date, default: Date.now }
});
var Visit = mongoose.model('Visit', VisitSchema);
var express = require('express');
express()
.get('*', function(req, res){
Visit.create({ url: req.url }, function(err, doc) {
Visit.find(function(err, docs) {
var log = '';
docs.forEach(function(doc, index) {
log += 'Visited ' + doc.url + ' on ' + doc.time + '.<br>';
});
res.send(log);
});
});
})
.listen(1337, '127.0.0.1');
In der dritten Zeile erstellen wir ein Schema für unsere Besuche. Wir legen fest, dass Dokumente für die Besuche zwei Felder besitzen: ein Feld url
vom Typ String
und ein Feld time
vom Typ Date
. Gleichzeitig legen wir für das Feld time
einen Defaultwert fest. Dieser wird automatisch gesetzt, wenn beim Speichern des Dokumentes das Feld leer ist. Anschließend wird vom abstrakten Schema ein sogenanntes Model erstellt, welches eine API zum Speichern und Finden von Dokumenten bereitstellt (- ähnlich wie die Collection im Beispiel zuvor). Der restliche Code verhält sich von der Logik her wie das Beispiel zuvor. Wir müssen in der Middleware lediglich die Zeit des Besuches nicht mehr explizit speichern, da unser Schema diese Aufgabe übernimmt.
Euer Ergebnis sollte ungefähr so aussehen:
Wie ihr seht sind die Einträge aus dem vorigen Beispiel noch erhalten geblieben. Wir verwenden schließlich die gleiche Datenbank! Lediglich die Angabe der Zeit wurde anders formatiert, da wir für das Feld time
den Typ Date
festgelegt haben und Mongoose dementsprechend den Wert vorformatiert.
Im nächsten Artikel stelle ich euch das Konzept von REST vor. Mit REST können wir später die Daten aus unserer Datenbank einfach über einen Client abfragen und manipulieren – der Server dient dabei als Vermittler zwischen Client und Datenbank. Ein schönes Konzept also, das alle unsere Technologien des MEAN Stacks miteinander verbindet.