苦逼前端

解决mongodb多次open报错

Nodejs2014-12-15 18:54

用过mongodb的同学们可能都遇到过,mongodb在open之后没来的及close,再进行一次open操作将会导致报错,整个nodejs进程都死掉了。如下图:

解决方法大致有以下几种:

  1. 使用 Mongoose
  2. open之后,就不再close

以上两种解决方案,对于我这个强迫症患者来说,都有问题。前者太霸道,后者有不确定因素。

一次偶然的机会,发现了mongodb.openCalled,顾名思义,如果mongodb已经open了,它的值为true:

var mongodb = require('mongodb'),
    Db = mongodb.Db,
    Connection = mongodb.Connection,
    Server = mongodb.Server,
    mongo = new Db(某db, new Server(host, Connection.DEFAULT_PORT, {safe: true}), {w: 1}),
    db = {};

db.open = function(callback){
    if(mongo.openCalled){
        callback(null, mongo);
    }
    else{
        mongo.open(callback);
    }
};

db.get = function(table, conditions, callback){
    this.open(function(err, db){
        if(err){
            mongo.close();
            return console.log(err);
        }
        db.collection(table, function(err, collection){
            if(err){
                mongo.close();
            }
            var sort = conditions['sort'] || null,
                limit = conditions['limit'] || null;
            delete conditions['sort'];
            delete conditions['limit'];
            collection.find(conditions).sort(sort).limit(limit).toArray(function(err, result){
                mongo.close();
                callback(err, result);
            });
        });
    });
};
评论(0)
  • 暂无评论,求挽尊...
还可输入200个字