解决 mongodb 多次 open 报错
用过 mongodb 的同学们可能都遇到过,mongodb 在 open 之后没来的及 close, 再进行一次 open 操作将会导致报错,整个 nodejs 进程都死掉了。如下图:
解决方法大致有以下几种:
-
使用 Mongoose
-
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);
});
});
});
};