成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6最簡(jiǎn)單的方式訪問(wèn)MongoDB

pekonchan / 2618人閱讀

摘要:前言越來(lái)越流行,也越來(lái)越流行,也許你第一時(shí)間用上了框架,但是如何才能在用的方式訪問(wèn)呢其實(shí)上不少類似的方案,比如你繼續(xù)使用的方式操作數(shù)據(jù)庫(kù),其實(shí)都沒(méi)什么不可以。我的項(xiàng)目比較簡(jiǎn)單,不想用太多復(fù)雜的框架,自己寫(xiě)個(gè)來(lái)連接數(shù)據(jù)庫(kù)好了。

前言
MongoDB越來(lái)越流行,NodeJS也越來(lái)越流行,也許你第一時(shí)間用上了KOA框架,但是如何才能在KOA用ES6的方式訪問(wèn)MongoDB呢?其實(shí)Github上不少類似的方案,比如你繼續(xù)使用mongoose的Promise方式操作數(shù)據(jù)庫(kù),其實(shí)都沒(méi)什么不可以。我的項(xiàng)目比較簡(jiǎn)單,不想用太多復(fù)雜的框架,自己寫(xiě)個(gè)Helper來(lái)連接數(shù)據(jù)庫(kù)好了。

代碼其實(shí)很簡(jiǎn)單,我貼出來(lái),給官方驅(qū)動(dòng)包個(gè)Promise殼兒,所有操作返回官方Promise,然后yield調(diào)用就這么簡(jiǎn)單

// helper_mongo.js文件
// 作者freewolf
// 當(dāng)然還是使用官方驅(qū)動(dòng)
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);
            });
        });
    });
}
// 查找一個(gè)
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);
                });
            }
        });
    });
}
// 查找多個(gè)
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);
            });
        });
    });
}
// 計(jì)數(shù)
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結(jié)束
怎么使用呢?
使用一個(gè)Service來(lái)裝飾一下

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

module.exports = {
    // 創(chuàng)建
    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來(lái)查詢
    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;
    },

    // 列出(帶分頁(yè))
    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;
    },

    // 計(jì)數(shù)
    count : function * (query){
        if(!query)
            query = {};
        var res = yield helperMongo.count(this.collectionName, query);
        return res;
    }
}

然后呢?
其實(shí)更簡(jiǎn)單 單例的操作從service繼承

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

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

    // 這里擴(kuò)充你自己的方法 比如 按照邀請(qǐng)碼搜索
    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();
// 其實(shí)可以直接返回單例實(shí)例在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"});
    // 查找 使用擴(kuò)展方法
    var user2 = yield serviceUser.getByInviteCode("abcd");
    // 分頁(yè)
    var sort = [["lastedittime", "desc"]];
    var pageSize = 20;  // 每頁(yè)20條
    var pageNum = 1;    // 第一頁(yè)
    var users = yield serviceUser.getByPage({}, sort, pageSize, pageNum);
    // ......
});

就寫(xiě)這么多吧,這個(gè)玩意就是官方驅(qū)動(dòng)包個(gè)殼,很好用,滿足一般的需求。其實(shí)JS我并不太擅長(zhǎng),有什么語(yǔ)法怪怪的地方,歡迎大家拍磚~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/18787.html

相關(guān)文章

  • 用agenda和agendash管理定時(shí)任務(wù)

    摘要:通過(guò)實(shí)例的方法,就可以綁定事件和處理函數(shù),第一個(gè)參數(shù)是事件名稱,第二個(gè)就是處理事件的回調(diào)函數(shù)因?yàn)樘幚硎沁^(guò)程是異步的,所以結(jié)束之后要調(diào)用。 showImg(https://segmentfault.com/img/remote/1460000008845353); 在軟件系統(tǒng)的運(yùn)維中,總有一些事件,需要在特定的時(shí)間來(lái)觸發(fā)執(zhí)行,這個(gè)時(shí)候,我們需要用到定時(shí)任務(wù)。 agenda是nodejs實(shí)...

    ranwu 評(píng)論0 收藏0
  • 用agenda和agendash管理定時(shí)任務(wù)

    摘要:通過(guò)實(shí)例的方法,就可以綁定事件和處理函數(shù),第一個(gè)參數(shù)是事件名稱,第二個(gè)就是處理事件的回調(diào)函數(shù)因?yàn)樘幚硎沁^(guò)程是異步的,所以結(jié)束之后要調(diào)用。 showImg(https://segmentfault.com/img/remote/1460000008845353); 在軟件系統(tǒng)的運(yùn)維中,總有一些事件,需要在特定的時(shí)間來(lái)觸發(fā)執(zhí)行,這個(gè)時(shí)候,我們需要用到定時(shí)任務(wù)。 agenda是nodejs實(shí)...

    AZmake 評(píng)論0 收藏0
  • 【實(shí)戰(zhàn)】用 express+MongoDB 搭建一個(gè)完整前端項(xiàng)目

    摘要:前言要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫(kù)來(lái)說(shuō),即使不認(rèn)識(shí)也要見(jiàn)個(gè)面的?;玖私獾母拍罹秃?,主要是安裝上數(shù)據(jù)庫(kù),并進(jìn)行簡(jiǎn)單的增刪操作。 前言:要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫(kù)來(lái)說(shuō),即使不認(rèn)識(shí)也要見(jiàn)個(gè)面的。本文給的例子很簡(jiǎn)單,也貼出來(lái)源碼,只要一步步下來(lái),就可以跑起來(lái)啦~~~ 思考一個(gè)需求:做一個(gè)登錄頁(yè)面,自己搭建服務(wù)和數(shù)據(jù)庫(kù),將用戶輸入的登錄信息保存到數(shù)據(jù)庫(kù)如何完成呢:首先選擇...

    Steve_Wang_ 評(píng)論0 收藏0
  • JS筆記

    摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁(yè)面加載發(fā)生了什么這是一篇開(kāi)發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...

    rottengeek 評(píng)論0 收藏0
  • ES6之Promise

    摘要:什么是使用有什么優(yōu)勢(shì)是異步編程的一種解決方案,優(yōu)勢(shì)是可以避免層層嵌套的回調(diào)。代表一個(gè)異步操作,有三種狀態(tài)進(jìn)行中已完成,又稱和已失敗。當(dāng)請(qǐng)求數(shù)據(jù)成功時(shí),通過(guò)對(duì)外傳遞請(qǐng)求結(jié)果。 1.什么是promise?使用promise有什么優(yōu)勢(shì)? promise是異步編程的一種解決方案,優(yōu)勢(shì)是可以避免層層嵌套的回調(diào)。 2.產(chǎn)生背景:在promise出現(xiàn)之前,你肯定寫(xiě)過(guò)這樣的代碼: $.ajax({ ...

    andong777 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

pekonchan

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<