日期:2012-4-12 来源:
在这个三个部分的教程中,我们教大家使用Node.js和Geddy来创建了一个todo的管理应用,上一篇我们将中,在这个系列最后一篇文章中,我们将介绍如何将todo项目保存到mongodb中。
介绍MongoDB
是一个由10gen开发的Nosql类型的数据库。这是node应用可以使用的超棒的数据库,它将数据保存为JSON格式。并且所有的查询都是使用javascript开发的。如果你想深入了解Mongdb,请参考这两篇文章:和。相信大家会有个基本的使用概念。
安装mongodb
到如下地址下载mongodb:
安装很简单,你可以参考上面文章内容。
MongoDB-Wrapper
对于我们的应用来说,我们使用一个模块来包装mongdb-native数据驱动。这很大的简化了代码,我们安装后进入你的应用并且执行如下:
npm install mongodb-wrapper
如果没有错误的话,你可以看到一个mongdb-wrapper目录出现在你的node_modules目录。
设置你的数据库
Mongdb非常简单,你不需要担心设置表,列或者数据库,简单的连接到数据库。就创建了一个!只需要添加到collection。接下来我们设置我们的应用。
编辑你的init.js文件
我们需要应用范围中访问DB ,所以我们添加代码到config/init.js。你可以看到如下:
// 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到数据库中,几乎不需要做太多。
重写我们的Modeal-Adapter
Geddy并不在乎你使用的后台,只要是使用MVC架构书写就好。这意味着你需要修改数据写入的部分都在model-adapter中。同时也注意这是一个adapter的完全重写,所以如果你需要保持使用内存保存数据的话,你需要将它备份到其它目录中。
编辑你的Save方法
打开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俩个操作。接下来我们详细介绍代码。
...
...
原文来自: