În acest tutorial de trei părți, vom fi scufundați adânc în crearea unei aplicații de gestionare a listelor în Node.js și Geddy. Aceasta este ultima intrare din serie, unde vom persista a face
la MongoDB.
Ca o reîmprospătare rapidă, ultima dată, am creat-o pe noi a face
resursă și a făcut o cerere de lucru pentru a face lista, dar datele existau doar în memorie. În acest tutorial, vom rezolva asta!
MongoDB este o bază de date de stocare a documentelor NoSQL creată de cei de la 10gen. Este o bază de date extraordinară pentru aplicațiile Node deoarece stochează datele deja în format JSON și interogările sale sunt scrise în JavaScript. Vom folosi-o pentru aplicația noastră, așa că hai să o pregătim.
Accesați http://www.mongodb.org/downloads și descărcați cea mai recentă versiune pentru sistemul dvs. de operare. Urmați instrucțiunile din textul readme de acolo. Asigurați-vă că puteți începe mongod
(și mergeți mai departe și lăsați-l să ruleze pe durata acestui tutorial)
Merită remarcat că va trebui să aveți mongo rulează oricând doriți ca aplicația dvs. să ruleze. Cei mai mulți oameni au setat acest lucru pentru a porni cu serverul lor folosind un script de pornire sau ceva de genul acesta.
Terminat? bine, hai să mergem mai departe.
Pentru aplicația noastră, vom folosi un modul care împachetează driver-ul bazei de date mongodb-native. Acest lucru simplifică foarte mult codul pe care îl vom produce, așa că lăsați-l instalat. CD
în aplicația dvs. și executați această comandă:
npm instalați mongodb-wrapper
Dacă totul merge bine ar trebui să aveți a MongoDB-înveliș
în directorul dvs. node_modules
director acum.
Mongo este un DB cu adevărat ușor de a lucra cu; nu trebuie să vă faceți griji cu privire la crearea de tabele, coloane sau baze de date. Pur și simplu conectându-vă la o bază de date, creați unul! Și doar prin adăugarea la o colecție, faceți una. Deci, să punem acest lucru pentru aplicația noastră.
Vom avea nevoie de acces la aplicația noastră DB, așa că să ne configurați codul config / init.js
. Deschide-l; ar trebui să arate astfel:
// adăugați un handler de excepție uncaught în medii prod-like dacă (geddy.config.environment! = 'Development') process.addListener ('uncaughtException', funcția (err) geddy.log.error (JSON.stringify ));); geddy.todos = []; geddy.model.adapter = ; geddy.model.adapter.Todo = cere (process.cwd () + '/lib/model_adapters/todo').Todo;
Să adăugăm în codul nostru db chiar în partea de sus (și să eliminăm matricea geddy.todos în timp ce suntem la el):
var mongo = necesită ("mongodb-wrapper"); geddy.db = mongo.db ("localhost", 27017, "todo"); geddy.db.collection ( 'todos'); // adăugați un handler de excepție uncaught în medii prod-like dacă (geddy.config.environment! = 'Development') process.addListener ('uncaughtException', funcția (err) geddy.log.error (JSON.stringify ));); geddy.model.adapter = ; geddy.model.adapter.Todo = cere (process.cwd () + '/lib/model_adapters/todo').Todo;
În primul rând, solicităm MongoDB-înveliș
modul. Apoi, am creat baza noastră de date și adăugăm o colecție. Aproape nici un set de la toate.
Geddy nu are grijă de ce backend de date pe care îl folosești, atâta timp cât ai un adaptor de model scris pentru el. Aceasta înseamnă că singurul cod pe care va trebui să îl modificați în aplicație este să-l primiți a face
s într-o bază de date se află în adaptorul de model. Acestea fiind spuse, aceasta va fi o rescriere completă a adaptorului, deci dacă doriți să păstrați vechea aplicație în memorie în jur, veți dori să copiați codul într-un alt director.
Deschideți adaptorul dvs. de model (lib / model_adapters / todo.js
) și găsiți Salvați
metodă. Ar trebui să arate ceva de genul:
this.save = funcția (todo, opts, callback) if (tip callback! = 'funcția') callback = funcția () ; var todoErrors = null; pentru (var i în geddy.todos) // dacă este deja acolo, salvați-l dacă (geddy.todos [i] .id == todo.id) geddy.todos [i] = todo; todoErrors = geddy.model.Todo.create (todo) .errors; retur apel invers (todoErrors, todo); todo.saved = true; geddy.todos.push (todo); retur apel invers (null, todo);
Faceți-o să arate astfel:
this.save = funcția (todo, opts, callback) // uneori nu vom avea nevoie să transmitem un apel invers dacă (typeof callback! = 'function') callback = function () ; // Mongo nu-i place când trimiteți funcții la acesta // deci să ne asigurăm că folosim doar proprietățile cleanTodo = id: todo.id, saved: todo.saved, title: todo.title, status : todo.status; // verificați dublu pentru a vedea dacă acest lucru este valabil todo = geddy.model.Todo.create (cleanTodo); if (todo.isValid ()) retur apel invers (todo.errors, null); // Verificați dacă avem acest lucru pentru a face articolul deja geddy.db.todos.findOne (id: todo.id, funcția (err, doc) if (err) retur apel invers (err, null); // dacă avem deja elementul de făcut, actualizați-l cu noile valori dacă (doc) geddy.db.todos.update (id: todo.id, cleanTodo, funcția (err, docs) (todo.errors, todo);); // daca nu avem deja elementul de facut, salveaza unul nou todo.saved = true; geddy.db.todos.save (todo, function ( err, docs) retur apel invers (err, docs);););
Nu fi prea rău de acest lucru; am început cu cea mai complexă prima. Ține minte faptul că noi Salvați
metoda trebuie să țină seama atât de noi a face
s și actualizarea vechilor a face
s. Deci, hai să trecem prin acest pas pas cu pas.
Utilizăm același cod de apel ca și înainte - dacă nu avem un apel invitat la noi, trebuie doar să utilizați o funcție goală.
Apoi ne santivăm a face
articol. Trebuie să facem asta pentru că noi a face
obiect are metode JavaScript pe ea (cum ar fi Salvați
), iar Mongo nu-i place când îi transmiteți obiecte cu metode pe ele. Deci, noi creăm un nou obiect doar cu proprietățile pe care ne pasă.
Apoi, verificăm să vedem dacă a face
este valabil. Dacă nu este, sunăm apelul cu erorile de validare. Dacă este, vom continua.
În cazul în care avem deja acest lucru a face
în db, verificăm db pentru a vedea dacă a a face
există. Aici începem să folosim MongoDB-înveliș
modul. Ne dă un API curat pentru a lucra cu db-ul nostru. Aici folosim db.todos.findOne ()
pentru a găsi un singur document care să ne statistice interogarea. Interogarea noastră este un simplu obiect JS - căutăm un document al cărui id
este aceeași cu cea a noastră a face
s id
. Dacă găsim una și nu există o eroare, vom folosi db.todos.update ()
metodă de actualizare a documentului cu noile date. Dacă nu găsim una, vom folosi db.todos.save ()
pentru salvarea unui nou document cu a face
elemente ale datelor.
În toate cazurile, sunăm un apel invers când suntem gata, cu erori pe care le-am primit și documentele pe care db le-a revenit,.
Uitați-vă la toate
metoda ar trebui să arate astfel:
this.all = funcția (apel invers) callback (null, geddy.todos);
Să facem să arate așa:
this.all = funcția (apel invers) var todos = []; (err, docs) // dacă există o eroare, reveniți mai devreme dacă (err) retur apel invers ( err, null); // // iterați prin docs și creați modele din ele pentru (var i in docs) todos.push (docs [i]) return callback (null, todos););
Mult mai simplu decât Salvați
metoda, nu crezi? Noi folosim db.todos.find ()
pentru a obține toate elementele din Todos
Colectie. Noi folosim monogdb-înveliș
e api la fel
rezultatele prin stare
(în ordine descendentă în ordine alfabetică) și prin titlu
(în ordine alfabetică ascendentă). Apoi le trimitem la o matrice, care declanșează interogarea pentru a începe. Odată ce primim datele noastre înapoi, verificăm dacă există erori, dacă există, sunăm apelul cu eroarea. Dacă nu există erori, vom continua.
Apoi, vom trece prin toate Documente
(documentele pe care mongo le-a dat înapoi), creați noi a face
instanțe de model pentru fiecare dintre ele și împingeți-le la o Todos
matrice. Când terminăm acolo, sunăm callback-ul, trecând înapoi Todos
.
Aruncați o privire la metoda "încărcare", ar trebui să arate ceva de genul:
this.load = funcția (id, callback) pentru (var i în geddy.todos) if (geddy.todos [i] .id == id) retur apel invers (null, geddy.todos [i]); apel invers (message: "Nu se găsește", null); ;
Să facem să arate așa:
this.load = funcția (id, callback) var todo; // găsiți un todo în db geddy.db.todos.findOne (id: id, funcția (err, doc) // dacă există o eroare, reveniți mai devreme dacă (err) returnback callback (err, null) ; // dacă există un doc, creați un model din acesta dacă (doc) todo = geddy.model.Todo.create (doc); retur apel invers (null, todo);); ;
Aceasta este chiar mai simplă. Noi folosim db.todos.findOne ()
din nou. De data aceasta, tot trebuie să folosim. Dacă avem o eroare, sunăm apelul invers cu el, dacă nu, vom continua (văzând un model aici încă?). Dacă avem un document, vom crea o nouă instanță a a face
model și apelează callback-ul cu acesta. Asta pentru asta.
Uitați-vă la elimina
acum, ar trebui să arate astfel:
this.remove = funcția (id, callback) if (typeof callback! = 'funcția') callback = funcția () ; pentru (var i în geddy.todos) if (geddy.todos [i] .id == id) geddy.todos.splice (i, 1); retur apel invers (null); retur apel invers (message: "Nu se găsește"); ;
Să facem să arate așa:
this.remove = funcția (id, callback) if (typeof callback! = 'funcția') callback = funcția () ; geddy.db.todos.remove (id: id, funcția (err, res) callback (err););
Metoda de ștergere este chiar mai scurtă decât a fost. Noi folosim db.todos.remove ()
metodă de eliminare a oricăror documente care au fost transmise id
și apelați callback-ul cu o eroare (dacă există).
Hai să examinăm aplicația noastră: CD
în directorul proiectului dvs. și porniți serverul cu geddy
. Creaza un nou a face
. Încercați să o editați, să nu reușiți unele validări și să încercați să o eliminați. Totul funcționează!
Sper că v-ați bucurat să aflați despre Node.js, MongoDB și în special despre Geddy. Sunt sigur că până acum aveți un milion de idei pentru ceea ce ați putea construi cu ea și mi-ar plăcea să aud despre ele. Ca întotdeauna, dacă aveți întrebări, lăsați un comentariu aici sau deschideți o problemă pe github.