幾乎網上全部的使用mongoose的例子都是長鏈接的方式,由於nodejs自己機制的關係,使用長鏈接必定程度上會提升性能,可是bae的免費mongodb不支持長連接,以前也有不少人作了嘗試,好比斷開後捕捉錯誤,而後自動重連的方式,如今來看都不太成功,因而仍是中規中矩的使用短連接的方式來作吧,這裏實現了一個鏈接打開和關閉的託管。javascript
mongoosekeeper.jshtml
'use strict'; var mongoose = require('mongoose'); var util = require("util"); function MongooseKeeper() { this.db = mongoose.createConnection(); this.open_count = 0; } MongooseKeeper.prototype.config = function(conf) { // body... var options = { db: { native_parser: true }, server: { poolSize:4 } }; var constr = ""; if(process.env.MONGO_DB_STR){ constr = process.env.MONGO_DB_STR ; } else{ //'mongodb://user:pass@localhost:port/database' constr = util.format('mongodb://%s:%s@%s:%d/%s', conf.userid,conf.password,conf.host,conf.port,conf.database); } this.dbUri = constr; this.options = options; } MongooseKeeper.prototype.open =function() { this.open_count++; if(this.open_count ==1 && this.db.readyState == 0) { this.db.open(this.dbUri,this.options,function() { // body... console.log("db opened"); }); } } MongooseKeeper.prototype.close =function() { this.open_count--; if(this.open_count == 0 ) { this.db.close(function(){ console.log("db closed"); }); } } MongooseKeeper.prototype.use = function(action,callback) { //OPEN var self = this; self.open(); action.call(null,function() { //CLOSE console.log("正在訪問的數據庫請求量"+self.open_count); self.close(); callback.apply(null, arguments); //DONE self =null; }) }; exports = module.exports = new MongooseKeeper();
首先在應用啓動的時候,好比在app.js中,配置數據鏈接的等信息java
// 引用mongoosekeeper var mongoosekeeper = require('./lib/mongoosekeeper');
// 調用更新配置,這裏的配置能夠去讀某個json mongoosekeeper.config({ "host": "192.168.57.186", "database": "dbname", "userid":"userid", "password":"123456", "port":27017 });
定義Modelnode
'use strict'; var mongoose = require('mongoose'); var Schema = mongoose.Schema; var mongokeeper = require('../lib/mongoosekeeper'); var articleModel = function () { var articleSchema = new Schema({ content : String, // 發佈內容 type : Number, // pictures : [{url:String,width:Number,height:Number}], // 配圖 thumbnails : [{url:String,width:Number,height:Number}], // 縮略圖 tags : [String], // 標籤 author : String, // 發佈人帳號 author_name : String, // 發佈人名稱 create_date : { type: Date, default: Date.now }, //建立時間 meta : { votes : Number, //頂 favs : Number //收藏 } }); //由於使用了createConnection 這裏要使用mongokeeper.db.model //而不是mongoose.model return mongokeeper.db.model('article', articleSchema); }; module.exports = new articleModel();
在調用model的時候,使用 mongoosekeeper.use
方法包裝實際的調用便可git
var express = require('express'), router = express.Router(), mongoosekeeper = require('../lib/mongoosekeeper'), articleModel = require('../models/articleModel'); /* GET home page. */ router.get('/', function(req, res) { mongoosekeeper.use(queryArticle,function(err,list){ if(err){ throw err; } else{ res.render('index',{data:list}); } }); }); //proxy 參數即爲mongoosekeeper.use的第二個參數 function queryArticle(proxy){ var search = {} ; //獲取全部文章 var query = articleModel.find(search).limit(25); query.sort('-create_date'); query.exec(proxy); } module.exports = router;
完整代碼mongodb