Node.js中的MongoDB本机驱动程序连接限制

时间:2015-04-17 16:51:03

标签: node.js mongodb express

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

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

您似乎为每个请求打开了一个新连接(然后没有关闭):您不需要这样做。

你应该只调用一个getConnection(),并将连接处理程序存储在某个地方,以便在每个路由中使用它。全局变量可以工作,或将其添加到Express应用程序中。

PS:你可能也想试试Mongoose,也许;)