在BAE中使用mongoose操做mongodb

在BAE中使用mongoose操做mongodb

  幾乎網上全部的使用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

相關文章
相關標籤/搜索