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

IMAGE

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

  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);
            });
        });
    });
};