好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>高手进阶
<tfoot draggable='sEl'></tfoot>

Node.js和Geddy初学者指南 第三部分:使用Mongdb持久化你的数据

Node.js和Geddy初学者指南 第三部分:使用Mongdb持久化你的数据

Node.js和Geddy初学者指南 - 第三部分:使用Mongdb持久化你的数据

在这个三个部分的教程中,我们教大家使用Node.js和Geddy来创建了一个todo的管理应用,上一篇我们将 数据保存在内存 中,在这个系列最后一篇文章中,我们将介绍如何将todo项目保存到mongodb中。

介绍MongoDB

MongoDB 是一个由10gen开发的Nosql类型的数据库。这是node应用可以使用的超棒的数据库,它将数据保存为JSON格式。并且所有的查询都是使用javascript开发的。如果你想深入了解Mongdb,请参考这两篇文章: Nosql数据库教程之初探MongoDB - 第一部分 和 Nosql数据库教程之初探MongoDB - 第二部分 。相信大家会有个基本的使用概念。

安装mongodb

到如下地址下载mongodb:

http://www.mongodb.org/downloads  

安装很简单,你可以参考上面文章内容。

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俩个操作。接下来我们详细介绍代码。

我们使用同样的callback方法,如果我们没有callback方法,那么使用一个空的方法。

然后我们处理todo项目。我们必须这样做的原因在于我们的todo对象拥有javascript的方法(类似save),但是Mongo不希望你们传递对象的时候包含方法。因此我们需要创建一个新的对象,只包含我们需要的属性。

然后,我们判断todo是否合法。如果不的话,我们调用带有验证错误的callback 。如果合法,就继续。

为 了避免我们在数据库中已经包含了todo数据,我们检查是否todo存在。这里开始我们使用mongodb-wrapper模块。它提供了我们一个干净的 API来和数据库交互。这里我们使用db.todos.findOne()方法来找到一个简单document来满足我们的查询。我们的查询是一个简单 js对象 - 我们查找一个id和todo的id一样的documen。如果我们找到一个并且没有报错,我们使用db.todos.update()方法来更新 document中的数据。如果没有找到,我们使用db.todos.save()方法来保存一个新的包含todo项目的document。

在所有的情况中,完成后我们都调用一个callback,所有我们得到的错误和db返回的docs都将传递到这个callback中。

编辑all方法

首先我们看看all方法,应该类似下面:

 this .all =  function   (callback) {
  callback(  null  , geddy.todos);
} 

我们修改成这样:

 this .all =  function   (callback) {
    var  todos =  [];
  geddy.db.todos.find().sort({status:  -1, title: 1}).toArray( function  (err, docs){
      //   if there's an error, return early 
     if   (err) {
        return  callback(err,  null  );
    }
      //   iterate through the docs and create models out of them 
     for  ( var  i  in   docs) {
      todos.push( geddy.model.Todo.create(docs[i]) )
    }
      return  callback( null  , todos);
  });
} 

比 save方法简单多了,对吧?我们使用db.todos.find()方法得到所有todos集合中的项目。我们使用mongdb-wrapper的 API通过status和标题来排序结果(降序排列)。然后我们传递到array,这个数组将触发查询。一旦我们得到数据,我们看看是否有错误,如果有, 我们调用错误的callback,如果没有,则继续。

然后,我们循环所有的docs(mongo返回的所有document内容),创建新的todo model实例,将他们推送到todos数组中。完毕后,我们调用callback,传递到todos。

编辑load方法

看看load方法,如下:

 this .load =  function   (id, callback) {
    for  ( var  i  in   geddy.todos) {
      if  (geddy.todos[i].id ==  id) {
        return  callback( null  , geddy.todos[i]);
    }
  }
  callback({message:  "To Do not found"},  null  );
}; 

修改成:

 this .load =  function   (id, callback) {
    var   todo;
    //   find a todo in the db 
  geddy.db.todos.findOne({id: id},  function  (err, doc){
      //   if there's an error, return early 
     if   (err) {
        return  callback(err,  null  );
    }
      //   if there's a doc, create a model out of it 
     if   (doc) {
      todo  =  geddy.model.Todo.create(doc);
    }
      return  callback( null  , todo);
  });
}; 

这个更加简单。我们再次使用db.todos.findOne()方法。这一次,我们就这么用。如果遇到错误,我们调用callback,如果没有继续。如果我们得到了一个doc,我们创建一个新的todo model实例并且调用callback。

编辑remove方法

看看remove方法如下:

 this .remove =  function  (id, callback) {
    if  ( typeof  callback != 'function' ) {
    callback  =  function  (){};
  }
    for  ( var  i  in   geddy.todos) {
      if  (geddy.todos[i].id ==  id) {
      geddy.todos.splice(i,  1 );
        return  callback( null  );
    }
  }
    return  callback({message: "To Do not found" });
}; 

修改为:

 this .remove =  function  (id, callback) {
    if  ( typeof  callback != 'function' ) {
    callback  =  function  (){};
  }
  geddy.db.todos.remove({id: id},   function  (err, res){
    callback(err);
  });
} 

这个remove方法更加简单。使用db.todos.remove()方法来删除所有指定id的document并且调用一个带有error的callback。

最后的展示

最后让我们测试一下,cd到你的项目目录,使用geddy启动服务器。创建一个todo,编辑,使用错误的输入让它报错,删除,是不是都可以正常工作吧!

总结

我们希望通过这篇文章大家能够学习到Node.js,MongoDB和Geddy。如果你有什么好的建议或者意见,请给我们留言。谢谢!

欢迎访问GBin1.com

 

标签:  javascript ,  node.js ,  geddy ,  frameworks ,  js框架

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Node.js和Geddy初学者指南 第三部分:使用Mongdb持久化你的数据的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did49353

更新时间:2022-09-24   阅读:48次

上一篇: 一周最新示例代码回顾 (4/9–4/15)

下一篇:深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别

相关资讯

最新资料更新

  • 1.京东LBS推荐算法实践
  • 2.金三银四复工高频面试题java算法LeetCode396旋转函数
  • 3.算法学习笔记(2): 逆元及其应用
  • 4.LRU 居然翻译成最近最少使用?真相原来是这样!
  • 5.推荐系统[二]:召回算法超详细讲解[召回模型演化过程、召回模型主流常见算法(DeepMF_TDM_A
  • 6.装箱算法的性能测试
  • 7.《落实算法安全主体责任基本情况》范文,修改主体即可提交
  • 8.Python 元组列表排序:初学者可能忽视的细节
  • 9.【基数排序算法详解】Java/Go/Python/JS/C不同语言实现
  • 10.1164: 零起点学算法71——C语言合法标识符(存在问题)
  • 11.1152: 零起点学算法59——找出一个数组中出现次数最多的那个元素
  • 12.002_C/C++笔试题_简单算法程序
  • 13.Java模拟实现HashMap算法流程详解
  • 14.1159: 零起点学算法66——反话连篇
  • 15.C++最短路径Dijkstra算法的分析与具体实现详解
  • 16.【动画笔记】数据结构-AVL树的插入操作
  • 17.文心一言 VS 讯飞星火 VS chatgpt (89)-- 算法导论8.3 2题
  • 18.VSCode一键接入Notebook体验算法套件快速完成水表读数
  • 19.Java怎么使用DFA算法实现敏感词过滤
  • 20.数据结构-布隆过滤器

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://www.haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]