Bestehende Todo-Liste mit MongoDB und Geddy

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!


Einführung in MongoDB

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.

MongoDB installieren

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.

MongoDB-Wrapper

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.


Einrichten Ihrer Datenbank

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.

Bearbeiten Sie Ihre init.js-Datei

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.


Umschreiben Ihres Modelladapters

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 machens 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.

Bearbeiten Ihrer Speichermethode

Ö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 machens und alte aktualisieren machens. 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 machens 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.

All-Methode bearbeiten

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-Wrapperist 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.

Lademethode bearbeiten

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.

Bearbeiten der Entfernungsmethode

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).


Zeit für die Magie

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!


Fazit

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.