我的MongoDB连接代码非常紧张。
我最近注意到我有很多打开的连接。 最终达到“连接限制”错误(在Linux中),我必须重新启动所有内容才能使其正常工作。
db.js:
var mongodb = require('mongodb');
var connection = null;
exports.getCollection = function(name, connectionConfig){
return getConnection(connectionConfig)
.then(function(conn){
return conn.collection(name);
})
.catch(function(err){
throw err;
});
};
function getConnection(configuration){
return promise(function(deferred){
configuration = configuration || config.envConfig.mongoConnections[0];
var isMainConnection = configuration === config.envConfig.mongoConnections[0];
if (isMainConnection && connection){
return { result: connection, isImediate: true };
}
var server = getServer(configuration);
var db = new mongodb.Db(configuration.name, server, { safe: true, auto_reconnect: true });
function openConnection(err, c){
if (err){
return deferred.reject(err);
}
if (isMainConnection){
connection = c;
}
console.log("Db connection opened.");
c.authenticate(configuration.user, configuration.pass, function (err){
if (err) {
c.close();
return deferred.reject(err);
}
return deferred.resolve(c);
});
c.on('close', function(){
console.log("Db connection closed.");
connection = null;
return deferred.reject(new Error("Db closed."));
});
}
db.open(openConnection);
return deferred.promise;
});
}
function getServer(config){
return new mongodb.Server(config.host, config.port, { auto_reconnect: true });
}
有人能帮助我吗?
答案 0 :(得分:1)
您似乎为每个请求打开了一个新连接(然后没有关闭):您不需要这样做。
你应该只调用一个getConnection()
,并将连接处理程序存储在某个地方,以便在每个路由中使用它。全局变量可以工作,或将其添加到Express应用程序中。
PS:你可能也想试试Mongoose,也许;)