日期: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俩个操做。接下来咱们详细介绍代码。
...