资讯专栏INFORMATION COLUMN

ES6最简单的方式访问MongoDB

pekonchan / 2468人阅读

摘要:前言越来越流行,也越来越流行,也许你第一时间用上了框架,但是如何才能在用的方式访问呢其实上不少类似的方案,比如你继续使用的方式操作数据库,其实都没什么不可以。我的项目比较简单,不想用太多复杂的框架,自己写个来连接数据库好了。

前言
MongoDB越来越流行,NodeJS也越来越流行,也许你第一时间用上了KOA框架,但是如何才能在KOA用ES6的方式访问MongoDB呢?其实Github上不少类似的方案,比如你继续使用mongoose的Promise方式操作数据库,其实都没什么不可以。我的项目比较简单,不想用太多复杂的框架,自己写个Helper来连接数据库好了。

代码其实很简单,我贴出来,给官方驱动包个Promise壳儿,所有操作返回官方Promise,然后yield调用就这么简单

// helper_mongo.js文件
// 作者freewolf
// 当然还是使用官方驱动
var MongoClient = require("mongodb").MongoClient;
var ObjectID = require("mongodb").ObjectID;

var mongoLink = ""; 
// 这里修改成你的MongoLink字符串mongodb://user:password@yourserver

// 插入方法
var insert = function(collectionName, obj) {
    return new Promise(function(resolve, reject) {
        MongoClient.connect(mongoLink, function(err, db) {
            if (err) reject(err);
            var collection = db.collection(collectionName);

            collection.insert(obj, {w: 1}, function(err, res) {
                db.close();
                if (err) reject(err);
                else resolve(res[0]);
            });
        });
    });
}
// 更新
var update = function(collectionName, obj) {
    return new Promise(function(resolve, reject) {
        MongoClient.connect(mongoLink, function(err, db) {
            if (err) reject(err);
            var collection = db.collection(collectionName);
            collection.update({_id: new ObjectID(obj._id)}, obj, {upsert: true,w: 1}, function(err, res) {
                db.close();
                if (err) reject(err);
                else resolve(res);
            });
        });
    });
}
// 查找一个
var findOne = function (collectionName, query, option) {
    return new Promise(function(resolve, reject) {
        MongoClient.connect(mongoLink, function(err, db) {
            if (err) reject(err);

            var collection = db.collection(collectionName);

            if(option==undefined || option==null)
            {
                collection.findOne(query, function(err, res) {
                    db.close();
                    if (err) reject(err);
                    else resolve(res);
                });
            }else{
                collection.findOne(query, option, function(err, res) {
                    db.close();
                    if (err) reject(err);
                    else resolve(res);
                });
            }
        });
    });
}
// 查找多个
var find = function(collectionName, query, option) {
    return new Promise(function(resolve, reject) {
        MongoClient.connect(mongoLink, function(err, db) {
            if (err) reject(err);

            var collection = db.collection(collectionName);
            if(option==undefined || option==null)
            {
                collection.find(query).toArray(function(err, res) {
                    db.close();
                    if (err) reject(err);
                    else resolve(res);
                });
            }else{
                collection.find(query, option).toArray(function(err, res) {
                    db.close();
                    if (err) reject(err);
                    else resolve(res);
                });
            }
        });
    });
}
// 删除
var remove = function(collectionName, query) {
    return new Promise(function(resolve, reject) {
        MongoClient.connect(mongoLink, function(err, db) {
            if (err) reject(err);
            var collection = db.collection(collectionName);

            collection.remove(query, {w: 1}, function(err, res) {
                db.close();
                if (err) reject(err);
                else resolve(res);
            });
        });
    });
}
// 计数
var count = function(collectionName, query, option) {
    return new Promise(function(resolve, reject) {
        MongoClient.connect(mongoLink, function(err, db) {
            if (err) reject(err);
            var collection = db.collection(collectionName);
            if(query==undefined || query==null)
                query = {};
            if(option==undefined || option==null)
            {
                collection.count(query, function(err, count) {
                    db.close();
                    if (err) reject(err);
                    else resolve(count);
                });
            }else{
                collection.count(query, option, function(err, count) {
                    db.close();
                    if (err) reject(err);
                    else resolve(count);
                });
            }
        });
    });
}

module.exports.insert = insert;
module.exports.update = update;
module.exports.findOne = findOne;
module.exports.find = find;
module.exports.remove = remove;
module.exports.count = count;

好了 Helper结束
怎么使用呢?
使用一个Service来装饰一下

// service.js文件
var ObjectID = require("mongodb").ObjectID;
var helperMongo = require("./helper_mongo");

module.exports = {
    // 创建
    insert : function * (obj){
        var res = yield helperMongo.insert(this.collectionName, obj);
        return res;
    },

    // 更新
    update : function * (obj){
        var res = yield helperMongo.update(this.collectionName, obj);
        return res;
    },

    // 删除
    remove : function * (id){
        var res = yield helperMongo.remove(this.collectionName, { _id : new ObjectID(id) });
        return res;
    },


    // 查询
    find : function * (query, option){
        var res = yield helperMongo.find(this.collectionName, query, option);
        return res;
    },

    // 查询
    findOne : function * (query, option){
        var res = yield helperMongo.findOne(this.collectionName, query, option);
        return res;
    },

    // 取全部
    getAll : function * (){
        var res = yield helperMongo.find(this.collectionName, {});
        return res;
    },

    // 按照id查询
    getById : function * (id){
        var res = yield helperMongo.findOne(this.collectionName, { _id : new ObjectID(id) });
        return res;
    },

    // 按照很多id来查询
    getByIds :function * (ids, option){
        ids = ids.map(function(id) { return new ObjectID(id); });
        var res = yield helperMongo.find(this.collectionName, {_id: {$in: ids}}, option);
        return res;
    },

    // 列出(带分页)
    getByPage : function*(query, sort, pageSize, pageNum){
        if(!query)
            query = {};
        if(!sort)
            sort = [["_id", "desc"]];
        var option = {
            sort : sort,
            limit: pageSize,
            skip : (pageNum - 1) * pageSize
        };
        var res = yield helperMongo.find(this.collectionName, query, option);
        return res;
    },

    // 计数
    count : function * (query){
        if(!query)
            query = {};
        var res = yield helperMongo.count(this.collectionName, query);
        return res;
    }
}

然后呢?
其实更简单 单例的操作从service继承

// service_user.js举例
var service = require("./service");
var helperMongo = require("../helper_mongo");
var ObjectID = require("mongodb").ObjectID;

var Service = function(){
    this.collectionName = "users";

    // 这里扩充你自己的方法 比如 按照邀请码搜索
    this.getByInviteCode = function * (inviteCode){
        var res = yield this.findOne({ invitecode : inviteCode });
        return res;
    }

    if(Service.instance == null)
    {
        Service.instance = this;
    }
    return Service.instance;
}
Service.prototype = service;

module.exports = Service;

好了 再看如何使用

var co = require("co");
var ServiceUser = require("./service_user.js");
var serviceUser = new ServiceUser();
// 其实可以直接返回单例实例在service_user.js 但是WS不能出提示 还是这样吧

// Demo下
co(function*(){
    var user = {name:"freewolf", password:"123", invitecode:"abcd"};
    // 插入
    yield serviceUser.insert(user); 
    
    // 查找 使用service包装的方法
    var user1 = yield serviceUser.find({name:"freewolf"});
    // 查找 使用扩展方法
    var user2 = yield serviceUser.getByInviteCode("abcd");
    // 分页
    var sort = [["lastedittime", "desc"]];
    var pageSize = 20;  // 每页20条
    var pageNum = 1;    // 第一页
    var users = yield serviceUser.getByPage({}, sort, pageSize, pageNum);
    // ......
});

就写这么多吧,这个玩意就是官方驱动包个壳,很好用,满足一般的需求。其实JS我并不太擅长,有什么语法怪怪的地方,欢迎大家拍砖~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18787.html

相关文章

  • 用agenda和agendash管理定时任务

    摘要:通过实例的方法,就可以绑定事件和处理函数,第一个参数是事件名称,第二个就是处理事件的回调函数因为处理是过程是异步的,所以结束之后要调用。 showImg(https://segmentfault.com/img/remote/1460000008845353); 在软件系统的运维中,总有一些事件,需要在特定的时间来触发执行,这个时候,我们需要用到定时任务。 agenda是nodejs实...

    ranwu 评论0 收藏0
  • 用agenda和agendash管理定时任务

    摘要:通过实例的方法,就可以绑定事件和处理函数,第一个参数是事件名称,第二个就是处理事件的回调函数因为处理是过程是异步的,所以结束之后要调用。 showImg(https://segmentfault.com/img/remote/1460000008845353); 在软件系统的运维中,总有一些事件,需要在特定的时间来触发执行,这个时候,我们需要用到定时任务。 agenda是nodejs实...

    AZmake 评论0 收藏0
  • 【实战】用 express+MongoDB 搭建一个完整前端项目

    摘要:前言要做一个全沾的工程师,对于后端和数据库来说,即使不认识也要见个面的。基本了解的概念就好,主要是安装上数据库,并进行简单的增删操作。 前言:要做一个全沾的工程师,对于后端和数据库来说,即使不认识也要见个面的。本文给的例子很简单,也贴出来源码,只要一步步下来,就可以跑起来啦~~~ 思考一个需求:做一个登录页面,自己搭建服务和数据库,将用户输入的登录信息保存到数据库如何完成呢:首先选择...

    Steve_Wang_ 评论0 收藏0
  • JS笔记

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。异步编程入门的全称是前端经典面试题从输入到页面加载发生了什么这是一篇开发的科普类文章,涉及到优化等多个方面。 TypeScript 入门教程 从 JavaScript 程序员的角度总结思考,循序渐进的理解 TypeScript。 网络基础知识之 HTTP 协议 详细介绍 HTT...

    rottengeek 评论0 收藏0
  • ES6之Promise

    摘要:什么是使用有什么优势是异步编程的一种解决方案,优势是可以避免层层嵌套的回调。代表一个异步操作,有三种状态进行中已完成,又称和已失败。当请求数据成功时,通过对外传递请求结果。 1.什么是promise?使用promise有什么优势? promise是异步编程的一种解决方案,优势是可以避免层层嵌套的回调。 2.产生背景:在promise出现之前,你肯定写过这样的代码: $.ajax({ ...

    andong777 评论0 收藏0

发表评论

0条评论

pekonchan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<