摘要:前言越來越流行,也越來越流行,也許你第一時(shí)間用上了框架,但是如何才能在用的方式訪問呢其實(shí)上不少類似的方案,比如你繼續(xù)使用的方式操作數(shù)據(jù)庫,其實(shí)都沒什么不可以。我的項(xiàng)目比較簡單,不想用太多復(fù)雜的框架,自己寫個(gè)來連接數(shù)據(jù)庫好了。
前言
MongoDB越來越流行,NodeJS也越來越流行,也許你第一時(shí)間用上了KOA框架,但是如何才能在KOA用ES6的方式訪問MongoDB呢?其實(shí)Github上不少類似的方案,比如你繼續(xù)使用mongoose的Promise方式操作數(shù)據(jù)庫,其實(shí)都沒什么不可以。我的項(xiàng)目比較簡單,不想用太多復(fù)雜的框架,自己寫個(gè)Helper來連接數(shù)據(jù)庫好了。
代碼其實(shí)很簡單,我貼出來,給官方驅(qū)動(dòng)包個(gè)Promise殼兒,所有操作返回官方Promise,然后yield調(diào)用就這么簡單
// 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來裝飾一下
// 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來查詢 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; }, // 計(jì)數(shù) count : function * (query){ if(!query) query = {}; var res = yield helperMongo.count(this.collectionName, query); return res; } }
然后呢?
其實(shí)更簡單 單例的操作從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"); // 分頁 var sort = [["lastedittime", "desc"]]; var pageSize = 20; // 每頁20條 var pageNum = 1; // 第一頁 var users = yield serviceUser.getByPage({}, sort, pageSize, pageNum); // ...... });
就寫這么多吧,這個(gè)玩意就是官方驅(qū)動(dòng)包個(gè)殼,很好用,滿足一般的需求。其實(shí)JS我并不太擅長,有什么語法怪怪的地方,歡迎大家拍磚~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/18787.html
摘要:通過實(shí)例的方法,就可以綁定事件和處理函數(shù),第一個(gè)參數(shù)是事件名稱,第二個(gè)就是處理事件的回調(diào)函數(shù)因?yàn)樘幚硎沁^程是異步的,所以結(jié)束之后要調(diào)用。 showImg(https://segmentfault.com/img/remote/1460000008845353); 在軟件系統(tǒng)的運(yùn)維中,總有一些事件,需要在特定的時(shí)間來觸發(fā)執(zhí)行,這個(gè)時(shí)候,我們需要用到定時(shí)任務(wù)。 agenda是nodejs實(shí)...
摘要:通過實(shí)例的方法,就可以綁定事件和處理函數(shù),第一個(gè)參數(shù)是事件名稱,第二個(gè)就是處理事件的回調(diào)函數(shù)因?yàn)樘幚硎沁^程是異步的,所以結(jié)束之后要調(diào)用。 showImg(https://segmentfault.com/img/remote/1460000008845353); 在軟件系統(tǒng)的運(yùn)維中,總有一些事件,需要在特定的時(shí)間來觸發(fā)執(zhí)行,這個(gè)時(shí)候,我們需要用到定時(shí)任務(wù)。 agenda是nodejs實(shí)...
摘要:前言要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫來說,即使不認(rèn)識(shí)也要見個(gè)面的?;玖私獾母拍罹秃?,主要是安裝上數(shù)據(jù)庫,并進(jìn)行簡單的增刪操作。 前言:要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫來說,即使不認(rèn)識(shí)也要見個(gè)面的。本文給的例子很簡單,也貼出來源碼,只要一步步下來,就可以跑起來啦~~~ 思考一個(gè)需求:做一個(gè)登錄頁面,自己搭建服務(wù)和數(shù)據(jù)庫,將用戶輸入的登錄信息保存到數(shù)據(jù)庫如何完成呢:首先選擇...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...
摘要:什么是使用有什么優(yōu)勢(shì)是異步編程的一種解決方案,優(yōu)勢(shì)是可以避免層層嵌套的回調(diào)。代表一個(gè)異步操作,有三種狀態(tài)進(jìn)行中已完成,又稱和已失敗。當(dāng)請(qǐng)求數(shù)據(jù)成功時(shí),通過對(duì)外傳遞請(qǐng)求結(jié)果。 1.什么是promise?使用promise有什么優(yōu)勢(shì)? promise是異步編程的一種解決方案,優(yōu)勢(shì)是可以避免層層嵌套的回調(diào)。 2.產(chǎn)生背景:在promise出現(xiàn)之前,你肯定寫過這樣的代碼: $.ajax({ ...
閱讀 3498·2023-04-26 03:05
閱讀 1549·2019-08-30 13:09
閱讀 1972·2019-08-30 13:05
閱讀 972·2019-08-29 12:42
閱讀 1461·2019-08-28 18:18
閱讀 3513·2019-08-28 18:09
閱讀 582·2019-08-28 18:00
閱讀 1780·2019-08-26 12:10