Nodejs 报错:connection closed

Nodejs 报错:connection closed

请教:为什么我在用mongodb时,在 db.open() 这个时候,有时候会报错:connection closed

代码如下: var poolModule = require(‘generic-pool’); exports.dbpool = pool = poolModule.Pool({ name : ‘mongo’, create : function(callback) { var server_options = { auto_reconnect: true },
db_options = { native_parser: true, strict: false, safe: false }; var mongo = require(“mongodb”); var mongoServer = new mongo.Server(‘10.0.0.125’, 27017, server_options); dbName = ‘test’; db = new mongo.Db(dbName, mongoServer, db_options); db.open(function(err, client){ if(err){ console.log('Error open db: '+err); return false; } if(callback) callback(err, client); }); }, destroy : function(client) { client.close(); }, max : 50, idleTimeoutMillis :30000, log : false });


4 回复

在使用 Node.js 和 MongoDB 时遇到 connection closed 错误通常是由于数据库连接问题或配置问题导致的。以下是一些可能的原因和解决方法:

可能的原因

  1. 网络问题:服务器可能因为网络问题而断开连接。
  2. 超时设置:MongoDB 配置中的超时时间可能导致连接在一段时间后被关闭。
  3. 数据库重启:如果数据库重启了,现有的连接会被关闭。

解决方法

1. 检查网络连接

确保你的服务器可以稳定地访问 MongoDB 服务器。你可以尝试从命令行使用 telnet 或其他工具测试连接。

2. 调整超时设置

你可以调整 MongoDB 的连接选项来延长超时时间。例如,可以在 server_options 中添加 socketTimeoutMS 参数:

var server_options = {
    auto_reconnect: true,
    socketTimeoutMS: 0 // 无限超时
};

3. 使用更稳定的连接池配置

你可以在连接池配置中增加一些参数,以提高连接的稳定性。例如,可以增加 max 参数以允许更多的并发连接,并调整 idleTimeoutMillis 参数以延长空闲连接的生存时间。

示例代码

var poolModule = require('generic-pool');
exports.dbpool = pool = poolModule.Pool({
    name     : 'mongo',
    create   : function(callback) {
        var server_options = {
            auto_reconnect: true,
            socketTimeoutMS: 0 // 无限超时
        },
        db_options = {
            native_parser: true,
            strict: false,
            safe: false
        };
        var mongo = require("mongodb");
        var mongoServer = new mongo.Server('10.0.0.125', 27017, server_options);
        dbName = 'test';
        db = new mongo.Db(dbName, mongoServer, db_options);
        db.open(function(err, client){
            if(err){
                console.log('Error opening database: ' + err);
                return false;
            }
            if(callback) callback(err, client);
        });
    },
    destroy  : function(client) {
        client.close();
    },
    max      : 100, // 增加最大连接数
    idleTimeoutMillis : 60000, // 延长空闲连接的生存时间
    log : false
});

总结

通过调整连接配置和检查网络连接,可以有效减少 connection closed 错误的发生。如果问题仍然存在,建议进一步检查 MongoDB 服务器的日志文件以获取更多信息。


今天把这个genneric-pool与mongodb的用法改装成这样,就出现了,以前不是这样的,但以前也是有别的问题的。。。

所以出现这个问题后,我就不知道该如何处理了!

居然还有这样的错误: { [Error: accept EMFILE] code: ‘EMFILE’, errno: ‘EMFILE’, syscall: ‘accept’ }

该如何是好啊!???

根据你的描述,错误信息 connection closed 通常表示数据库连接在某些情况下被关闭了。这种情况可能由多种原因引起,例如网络问题、MongoDB服务器配置问题或者代码逻辑问题等。

以下是几种可能导致该错误的情况及相应的解决方案:

  1. MongoDB 服务器重启:如果MongoDB服务器在运行过程中重启了,所有现有的连接都会被关闭。确保MongoDB服务器稳定运行,并考虑增加重连机制。

  2. 网络问题:检查客户端与服务器之间的网络连接是否稳定。可以尝试ping服务器以确认网络连接是否正常。

  3. 代码逻辑问题:在创建连接池时,如果数据库连接打开失败,但仍然返回了一个客户端实例,那么后续操作可能会导致异常。确保在连接失败时正确处理错误。

  4. 超时设置:在高并发情况下,连接池中的连接可能会被耗尽,导致新请求无法获取到可用连接。你可以调整max(最大连接数)和idleTimeoutMillis(连接空闲时间)来优化连接池配置。

以下是一段修改后的代码示例,增加了对错误处理和重连机制:

var poolModule = require('generic-pool');
exports.dbpool = pool = poolModule.Pool({
    name: 'mongo',
    create: function (callback) {
        var server_options = {
            auto_reconnect: true
        },
            db_options = {
                native_parser: true,
                strict: false,
                safe: false
            };
        var mongo = require("mongodb");
        var mongoServer = new mongo.Server('10.0.0.125', 27017, server_options);
        var dbName = 'test';
        var db = new mongo.Db(dbName, mongoServer, db_options);

        db.open(function (err, client) {
            if (err) {
                console.log('Error opening database: ' + err);
                // 尝试重新连接
                setTimeout(() => exports.dbpool.acquire().then(conn => callback(null, conn)), 5000); // 等待5秒后重试
                return;
            }
            callback(err, client);
        });
    },
    destroy: function (client) {
        client.close();
    },
    max: 50, // 调整最大连接数
    idleTimeoutMillis: 30000,
    log: false
});

此代码中,当数据库连接失败时,将等待5秒后自动尝试重新建立连接。这样可以避免因暂时性的网络问题或MongoDB服务重启导致的应用崩溃。同时,建议监控应用和数据库服务的状态,以便及时发现并解决问题。

回到顶部