日期:2012-4-12 來源:GBin1.comjavascript
在這個三個部分的教程中,咱們教你們使用Node.js和Geddy來建立了一個todo的管理應用,上一篇咱們將數據保存在內存中,在這個系列最後一篇文章中,咱們將介紹如何將todo項目保存到mongodb中。java
MongoDB是一個由10gen開發的Nosql類型的數據庫。這是node應用可使用的超棒的數據庫,它將數據保存爲JSON格式。而且全部的查詢都是使用javascript開發的。若是你想深刻了解Mongdb,請參考這兩篇文章:Nosql數據庫教程之初探MongoDB - 第一部分和Nosql數據庫教程之初探MongoDB - 第二部分。相信你們會有個基本的使用概念。node
到以下地址下載mongodb:sql
http://www.mongodb.org/downloads mongodb
安裝很簡單,你能夠參考上面文章內容。數據庫
對於咱們的應用來講,咱們使用一個模塊來包裝mongdb-native數據驅動。這很大的簡化了代碼,咱們安裝後進入你的應用而且執行以下:npm
npm install mongodb-wrapper
若是沒有錯誤的話,你能夠看到一個mongdb-wrapper目錄出如今你的node_modules目錄。bash
Mongdb很是簡單,你不須要擔憂設置表,列或者數據庫,簡單的鏈接到數據庫。就建立了一個!只須要添加到collection。接下來咱們設置咱們的應用。架構
咱們須要應用範圍中訪問DB ,因此咱們添加代碼到config/init.js。你能夠看到以下:app
// Add uncaught-exception handler in prod-like environments if (geddy.config.environment != 'development') { process.addListener('uncaughtException', function (err) { geddy.log.error(JSON.stringify(err)); }); } geddy.todos = []; geddy.model.adapter = {}; geddy.model.adapter.Todo = require(process.cwd() + '/lib/model_adapters/todo').Todo; Let’s add in our db code at the very top (and remove the geddy.todos array while we’re at it): var mongo = require('mongodb-wrapper'); geddy.db = mongo.db('localhost', 27017, 'todo'); geddy.db.collection('todos'); // Add uncaught-exception handler in prod-like environments if (geddy.config.environment != 'development') { process.addListener('uncaughtException', function (err) { geddy.log.error(JSON.stringify(err)); }); } geddy.model.adapter = {}; geddy.model.adapter.Todo = require(process.cwd() + '/lib/model_adapters/todo').Todo;
首先咱們要求mongdb-wrapper模塊。而後咱們設置咱們的數據庫,添加collection到數據庫中,幾乎不須要作太多。
Geddy並不在意你使用的後臺,只要是使用MVC架構書寫就好。這意味着你須要修改數據寫入的部分都在model-adapter中。同時也注意這是一個adapter的徹底重寫,因此若是你須要保持使用內存保存數據的話,你須要將它備份到其它目錄中。
打開model-adapter(lib/model_adapters/todo.js),找到save方法。應該以下:
this.save = function (todo, opts, callback) { if (typeof callback != 'function') { callback = function(){}; } var todoErrors = null; for (var i in geddy.todos) { // if it's already there, save it if (geddy.todos[i].id == todo.id) { geddy.todos[i] = todo; todoErrors = geddy.model.Todo.create(todo).errors; return callback(todoErrors, todo); } } todo.saved = true; geddy.todos.push(todo); return callback(null, todo); }
修改爲以下:
this.save = function (todo, opts, callback) { // sometimes we won't need to pass a callback if (typeof callback != 'function') { callback = function(){}; } // Mongo doesn't like it when you send functions to it // so let's make sure we're only using the properties cleanTodo = { id: todo.id , saved: todo.saved , title: todo.title , status: todo.status }; // Double check to see if this thing is valid todo = geddy.model.Todo.create(cleanTodo); if (!todo.isValid()) { return callback(todo.errors, null); } // Check to see if we have this to do item already geddy.db.todos.findOne({id: todo.id}, function(err, doc){ if (err) { return callback(err, null); } // if we already have the to do item, update it with the new values if (doc) { geddy.db.todos.update({id: todo.id}, cleanTodo, function(err, docs){ return callback(todo.errors, todo); }); } // if we don't already have the to do item, save a new one else { todo.saved = true; geddy.db.todos.save(todo, function(err, docs){ return callback(err, docs); }); } }); }
不要被這些代碼弄暈了,這是最複雜的一個。記住咱們的save方法必須同時處理新的todo和更新todo倆個操做。接下來咱們詳細介紹代碼。
...