In diesem dreiteiligen Lernprogramm werden wir uns eingehend mit der Erstellung einer App zum Verwalten von Aufgabenlisten in Node.js und Geddy beschäftigen. Dies ist der letzte Eintrag in der Serie, bei dem wir unsere Arbeit fortsetzen werden machen
Artikel zu MongoDB.
Zur schnellen Auffrischung haben wir unser letztes Mal unser erstellt machen
Ressource erstellt und eine funktionierende Aufgabenliste erstellt, aber die Daten waren nur im Arbeitsspeicher vorhanden. In diesem Tutorial werden wir das beheben!
MongoDB ist eine NoSQL-Dokumentenspeicher-Datenbank, die von den Leuten bei 10gen erstellt wurde. Es ist eine großartige Datenbank für Node-Apps, da ihre Daten bereits in einem JSON-ähnlichen Format gespeichert werden und die Abfragen in JavaScript geschrieben werden. Wir werden es für unsere App verwenden, also lassen Sie uns es einrichten.
Gehen Sie zu http://www.mongodb.org/downloads und laden Sie die neueste Version für Ihr Betriebssystem herunter. Folgen Sie den Anweisungen in der Readme. Stellen Sie sicher, dass Sie beginnen können Mongod
(und fahren Sie fort und lassen Sie es für die Dauer dieses Tutorials laufen)
Es ist erwähnenswert, dass Sie den Mongo jederzeit ausführen müssen, wenn Sie möchten, dass Ihre App ausgeführt wird. Die meisten Leute richten dies so ein, dass sie ihren Server mit einem Upstart-Skript oder ähnlichem starten.
Erledigt? Okay, lass uns weitergehen.
Für unsere App verwenden wir ein Modul, das den mongodb-nativen Datenbanktreiber umschließt. Dies vereinfacht den Code, den wir produzieren, erheblich. Lassen Sie uns ihn also installieren. CD
in Ihre App und führen Sie diesen Befehl aus:
npm mongodb-wrapper installieren
Wenn alles gut geht, sollten Sie eine haben Mongodb-Wrapper
Verzeichnis in Ihrem Knotenmodule
Verzeichnis jetzt.
Mongo ist eine sehr einfache Datenbank, mit der man arbeiten kann. Sie müssen sich nicht um das Einrichten von Tabellen, Spalten oder Datenbanken kümmern. Einfach durch Verbindung mit einer Datenbank erstellen, erstellen Sie eine! Durch das Hinzufügen zu einer Sammlung erstellen Sie eine. Also lass uns das für unsere App einrichten.
Wir benötigen Zugriff auf unsere DB-App-weit, also richten wir unseren Code ein config / init.js
. Öffne es; es sollte so aussehen:
// Füge einen unrecept-exception-Handler in prod-ähnlichen Umgebungen hinzu, wenn (geddy.config.environment! = 'Development') process.addListener ('uncaughtException', function (err)) geddy.log.error (JSON.stringify (err ));); geddy.todos = []; geddy.model.adapter = ; geddy.model.adapter.Todo = erfordern (process.cwd () + '/lib/model_adapters/todo').Todo;
Fügen Sie unseren DB-Code ganz oben hinzu (und entfernen Sie das Array geddy.todos, während wir gerade dabei sind):
var mongo = required ('mongodb-wrapper'); geddy.db = mongo.db ('localhost', 27017, 'todo'); geddy.db.collection ('todos'); // Füge einen unrecept-exception-Handler in prod-ähnlichen Umgebungen hinzu, wenn (geddy.config.environment! = 'Development') process.addListener ('uncaughtException', function (err)) geddy.log.error (JSON.stringify (err ));); geddy.model.adapter = ; geddy.model.adapter.Todo = erfordern (process.cwd () + '/lib/model_adapters/todo').Todo;
Zuerst benötigen wir die Mongodb-Wrapper
Modul. Dann richten wir unsere Datenbank ein und fügen eine Sammlung hinzu. Kaum eingerichtet.
Geddy kümmert sich nicht wirklich darum, welches Daten-Backend Sie verwenden, solange Sie einen Modelladapter dafür haben. Dies bedeutet, dass der einzige Code, den Sie in Ihrer App ändern müssen, um Ihre zu erhalten machen
s in einer Datenbank befindet sich im Modelladapter. Das heißt, dies ist eine vollständige Umschreibung des Adapters. Wenn Sie also Ihre alte In-Memory-App beibehalten möchten, müssen Sie den Code in ein anderes Verzeichnis kopieren.
Öffnen Sie Ihren Modelladapter (lib / model_adapters / todo.js
) und finde das sparen
Methode. Es sollte ungefähr so aussehen:
this.save = function (todo, opts, callback) if (typeof callback! = 'function') callback = function () ; var todoErrors = null; for (var i in geddy.todos) // Wenn es bereits vorhanden ist, speichern Sie es, wenn (geddy.todos [i] .id == todo.id) geddy.todos [i] = todo; todoErrors = geddy.model.Todo.create (todo) .errors; Callback zurückgeben (todoErrors, todo); todo.saved = true; geddy.todos.push (todo); Rückruf (null, Aufgabe) zurückgeben;
Lass es so aussehen:
this.save = function (todo, opts, callback) // Manchmal brauchen wir keinen Callback zu übergeben if (typeof callback! = 'function') callback = function () ; // Mongo mag es nicht, wenn Sie Funktionen an ihn senden // Stellen wir sicher, dass wir nur die Eigenschaften cleanTodo = id: todo.id, gespeichert: todo.saved, title: todo.title, status verwenden : todo.status; // Überprüfe, ob das Ding gültig ist todo = geddy.model.Todo.create (cleanTodo); if (! todo.isValid ()) return callback (todo.errors, null); // Prüfen Sie, ob wir dieses Element bereits haben. Geddy.db.todos.findOne (id: todo.id, function (err, doc) if (err) return callback (err, null); // Wenn das zu erledigende Element bereits vorhanden ist, aktualisieren Sie es mit den neuen Werten, wenn (doc) geddy.db.todos.update (id: todo.id, cleanTodo, function (err, docs) Rückruf zurückgeben (todo.errors, todo);); // Wenn wir noch nicht über den zu erledigenden Punkt verfügen, speichern Sie einen neuen Eintrag. todo.saved = true; geddy.db.todos.save (todo, function ( err, docs) return callback (err, docs);););
Sei nicht zu entmutigt von diesem; Wir haben zuerst mit dem komplexesten begonnen. Erinnern Sie sich an unsere sparen
Methode muss beide neu berücksichtigen machen
s und alte aktualisieren machen
s. Gehen wir diesen Code Schritt für Schritt durch.
Wir verwenden den gleichen Rückrufcode wie zuvor - wenn uns kein Rückruf übergeben wird, verwenden Sie einfach eine leere Funktion.
Dann säubern wir unsere machen
Artikel. Wir müssen das tun weil unser machen
Objekt hat JavaScript-Methoden (wie sparen
) und Mongo mag es nicht, wenn Sie Objekte mit Methoden darauf übergeben. Also erstellen wir einfach ein neues Objekt mit den Eigenschaften, die uns wichtig sind.
Dann prüfen wir, ob die machen
ist gültig. Ist dies nicht der Fall, rufen wir den Rückruf mit den Überprüfungsfehlern auf. Wenn ja, machen wir weiter.
Falls wir das schon haben machen
Artikel in der DB, überprüfen wir die DB, um zu sehen, ob a machen
existiert. Hier beginnen wir mit der Verwendung von Mongodb-Wrapper
Modul. Es gibt uns eine saubere API, um mit unserer Datenbank zu arbeiten. Hier benutzen wir die db.todos.findOne ()
Methode, um ein einzelnes Dokument zu finden, das unsere Abfrage anzeigt. Unsere Abfrage ist ein einfaches js-Objekt - wir suchen ein Dokument, dessen Ich würde
ist das gleiche wie unser machen
s Ich würde
. Wenn wir einen finden und es keinen Fehler gibt, verwenden wir die db.todos.update ()
Methode, um das Dokument mit den neuen Daten zu aktualisieren. Wenn wir keinen finden, benutzen wir die db.todos.save ()
Methode, um ein neues Dokument mit der machen
Daten des Artikels.
In allen Fällen rufen wir einen Callback auf, wenn wir fertig sind, mit etwaigen Fehlern und den Dokumenten, die die Datenbank an uns zurückgegeben hat.
Schauen Sie sich das an alles
Methode sollte es so aussehen:
this.all = function (callback) callback (null, geddy.todos);
Lass es so aussehen:
this.all = Funktion (Rückruf) var todos = []; geddy.db.todos.find (). sort (status: -1, title: 1). toArray (Funktion (err, docs) // Falls ein Fehler auftritt, kehren Sie früh zurück, wenn (err) return callback ( err, null); // Durchlaufen Sie die Dokumente und erstellen Sie daraus Modelle für (var i in docs) todos.push (geddy.model.Todo.create (docs [i])) Rückruf (null, todos););
Viel einfacher als das sparen
Methode, findest du nicht? Wir nehmen das db.todos.find ()
Methode, um alle Elemente in der todos
Sammlung. Wir benutzen Monogdb-Wrapper
ist zu Sortieren
die Ergebnisse von Status
(in absteigender alphabetischer Reihenfolge) und nach Titel
(in aufsteigender alphabetischer Reihenfolge). Dann senden wir das an ein Array, das den Start der Abfrage auslöst. Sobald wir unsere Daten zurückerhalten haben, überprüfen wir, ob Fehler vorliegen. Wenn ja, rufen wir den Rückruf mit dem Fehler auf. Wenn es keine Fehler gibt, machen wir weiter.
Dann durchlaufen wir alle docs
(die Dokumente, die der Mongo uns zurückgegeben hat), erstellen Sie neue machen
Modellinstanzen für jede von ihnen, und drücken Sie sie auf eine todos
Array. Wenn wir dort fertig sind, rufen wir den Rückruf an und übergeben den todos
.
Schauen Sie sich die Methode 'load' an. Diese sollte ungefähr so aussehen:
this.load = Funktion (id, callback) für (var i in geddy.todos) if (geddy.todos [i] .id == id) return callback (null, geddy.todos [i]); Rückruf (Nachricht: "Nicht gefunden", null); ;
Lass es so aussehen:
this.load = Funktion (ID, Rückruf) var todo; // ein todo in der Datenbank finden geddy.db.todos.findOne (id: id, function (err, doc) // Wenn ein Fehler auftritt, frühzeitig zurückkehren, wenn (err) return callback (err, null) ; // Wenn ein Dokument vorhanden ist, erstellen Sie daraus ein Modell. if (doc) todo = geddy.model.Todo.create (doc); return callback (null, todo);); ;
Dieser ist noch einfacher. Wir nehmen das db.todos.findOne ()
wieder Methode. Diesmal müssen wir aber dieses Mal alles verwenden. Wenn wir einen Fehler haben, rufen wir den Rückruf damit auf, andernfalls fahren wir fort (sehen Sie hier noch ein Muster?). Wenn wir ein Dokument haben, erstellen wir eine neue Instanz von machen
modellieren und den Rückruf damit aufrufen. Das war es für diesen einen.
Schauen Sie sich das an Löschen
Methode jetzt sollte es so aussehen:
this.remove = function (id, callback) if (Rückruftyp! = 'Funktion') callback = function () ; for (var i in geddy.todos) if (geddy.todos [i] .id == id) geddy.todos.splice (i, 1); Rückruf zurückgeben (null); Rückruf (Nachricht: "Nicht gefunden"); ;
Lass es so aussehen:
this.remove = function (id, callback) if (Rückruftyp! = 'Funktion') callback = function () ; geddy.db.todos.remove (id: id, function (err, res) callback (err););
Die Entfernungsmethode ist noch kürzer als früher. Wir nehmen das db.todos.remove ()
Methode, um alle Dokumente mit dem übergebenen zu entfernen Ich würde
und den Rückruf mit einem Fehler aufrufen (falls vorhanden).
Lass uns unsere App testen: CD
in das Verzeichnis Ihres Projekts und starten Sie den Server mit geddy
. Erstelle eine neue machen
. Versuchen Sie es zu bearbeiten, lassen Sie einige Überprüfungen fehl und entfernen Sie es. Es funktioniert alles!
Ich hoffe, es hat euch Spaß gemacht, etwas über Node.js, MongoDB und vor allem Geddy zu lernen. Ich bin mir sicher, dass Sie inzwischen eine Million Ideen haben, was Sie damit aufbauen könnten, und ich würde gerne von ihnen hören. Wie immer, wenn Sie Fragen haben, hinterlassen Sie hier einen Kommentar oder eröffnen Sie ein Problem auf Github.