Node.js中使用mongoskin操作mongoDB实例


Posted in Javascript onSeptember 28, 2014

一、废话

从13年1月份接触mongodb进行开发,开发了旅游标签服务、微博标签检索系统、地图服务、web APP服务...使用MongoDB的场景从.NET、JAVA环境转到了node.js平台。越发觉Node.js和mongodb结合感觉的很好。感觉mongodb和node.js是天生的一对。的确,mongodb的客户端是JS的解析引擎。因此,选择mongodb和node.js做产品原型也是很nice的选择。网上,遇到网友询问mongodb的开发,选择哪个driver最好,以前一直是使用原生的driver,但是写起来代码有很多需要注意的,比如连接的关闭操作等等...因此,在node.js开发环境下我这里推荐使用mongoskin。

二、几个需要说的概念

(1)数据库:同关系数据库一样。
(2)集合: 关系数据库中的表。
(3)文档: 类比关系数据库的记录,实则是JSON对象。
(4)数据库设计:建议考虑NoSQL设计,抛弃关系数据的设计思想;其实NoSQL数据库设计博大精深,需要不断地在项目中实践。
(5)用户体系:每一个数据库都有自己的管理员,可以:

use dbname; db.addUser('root_1' , 'test');

(7)建议更改对外端口
(8)启动服务(这是win下,linux下稍作修改):
mongod --dbpath "XX\MongoDB\data\db" --logpath "XX\MongoDB\log\mongo.log" --logappend -auth --port 7868

三、搭建mongodb开发基础设施

(0) npm install mongoskin 安装mongoskin

这里不介绍Node.js安装、package等机制。

(1)创建配置文件 config.json

{

    "dbname":"TEST",

    "port": "7868",

    "host": "127.0.0.1",

    "username": "test",

    "password": "test"

}

(2)创建util相关类mongo.js :导出一个DB对象

var mongoskin = require('mongoskin'),

    config = require('./../config.json');
/*

 * @des:导出数据库连接模块

 * */

module.exports = (function(){

    var host = config.host,

        port = config.port,

        dbName = config.dbname,

        userName = config.username,

        password = config.password,

        str = 'mongodb://' + userName + ':' + password + '@' + host +':' + port+ '/' + dbName;
    var option = {

        native_parser: true

    };
    return mongoskin.db(str, option);

})();

(3)构建CRUD的基础类:为了减少重复CURD代码,只需要传入相关的JSON对象即可

var db = require('./mongo.js'),

    status = require('./status'),

    mongoskin = require('mongoskin');


var CRUD = function(collection){

    this.collection = collection;

    db.bind(this.collection);

};
CRUD.prototype = {

    /*

    * @des: 创建一条记录

    * @model: 插入的记录,JSON格式的model

    * @callback:回调,返回插入成功的记录或者失败信息

    *

    * */

    create: function(model, callback){

        db[this.collection].save(model, function(err, item){

            if(err) {

                return callback(status.fail);

            }

            item.status = status.success.status;

            item.message = status.success.message;

            return callback(item);

        });

    },
    /*

    * @des:读取一条记录

    * @query:查询条件,Mongo查询的JSON字面量

    * @callback:回调,返回符合要求的记录或者失败信息

    *

    * */

    read: function(query, callback){

        db[this.collection].find(query).toArray(function(err, items){

            if(err){

                return callback(status.fail);

            }

            var obj = {

                status: status.success.status,

                message: status.success.message,

                items: items

            };
            return callback(obj);

        });

    },

    /*

    * @des:更新一条记录

    * @query:查询条件,Mongo查询的JSON字面量,此处为_id

    * @updateModel:需要更新的JSON格式的模型

    * @callback:返回成功或者失败信息

    *

    * */

    update: function(query, updateModel, callback){

        var set = {set: updateModel};

        db[this.collection].update(query, set, function(err){

            if(err){

                return callback(status.fail);

            }else{

                return callback(status.success);

            }

        });

    },
    /*

    * @des:删除一条记录

    * @query:查询条件,Mongo查询的JSON字面量

    * @callback:返回失败或者成功的信息

    *

    * */

    deleteData: function(query, callback){

        db[this.collection].remove(query, function(err){

            if(err){

                return callback(status.fail);

            }

            return callback(status.success);

        });

    }

};


module.exports = CRUD;

(4)构建status.json,因为需要一些状态表示成功和失败,后期可以拓展为验证码错误、短信验证错误、用户名错误等

module.exports = {

    /*

    * 成功状态

    *

    * */

    success: {

        status: 1,

        message: 'OK'

    },
    /*

    * 失败状态

    *

    * */

    fail: {

        status: 0,

        message: 'FAIL'

    },
    /*

    * 两次输入的密码不一致

    * */

    repeatPassword: {

        status: 0,

        message: '两次输入的密码不一致'

    }

 };
Javascript 相关文章推荐
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
Dec 25 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
May 26 Javascript
JavaScript和CSS通过expression实现Table居中显示
Jun 28 Javascript
浅谈javascript实现八大排序
Apr 27 Javascript
JS实现具备延时功能的滑动门菜单效果
Sep 17 Javascript
JS实现加载时锁定HTML页面元素的方法
Jun 24 Javascript
vue 1.x 交互实现仿百度下拉列表示例
Oct 21 Javascript
使用JavaScript中的lodash编写双色球效果
Jun 24 Javascript
vue生成token并保存到本地存储中
Jul 17 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
Jun 21 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
Jul 21 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
Sep 24 Javascript
js使用for循环与innerHTML获取选中tr下td值
Sep 26 #Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
Sep 26 #Javascript
简单方法判断JavaScript对象为null或者属性为空
Sep 26 #Javascript
jquery uploadify 在FF下无效的解决办法
Sep 26 #Javascript
jQuery判断当前点击的是第几个li的代码
Sep 26 #Javascript
javascript 自定义回调函数示例代码
Sep 26 #Javascript
jquery和js实现对div的隐藏和显示方法
Sep 26 #Javascript
You might like
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
Terran兵种介绍
2020/03/14 星际争霸
php 用sock技术发送邮件的函数
2007/07/21 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
基于javascript 闭包基础分享
2013/07/10 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
2015/09/11 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
卫生院健康教育实施方案
2014/06/07 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
python源码剖析之PyObject详解
2021/05/18 Python