mongoose远程连接mongodb,当客户端断开网络重连时报错topology was destoryed ?

问题描述:

我在我的电脑开启了一个mongodb数据库的服务,并配置了用户认证和远程连接。其他电脑通过我的ip地址以及设置的端口、配置的用户等连接到我的数据库,并可以进行读写操作。
但是,当远程连接我的数据库的电脑手动断开网络,再次接入网络的时候,或者长时间没有对我的数据库进行查询读写操作,就会报错,报错信息:

 "MongoError: Topology was destroyed"

而,我在本地进行了同样的测试,并没有问题。

我的方法?

于是查了一些资料,在mongoose连接数据库的时候,加上一些参数,如下:

var options = {
  server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } },
  replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }
};
mongoose.connect(secrets.db, options);

或者是这样的:

var options = { server: { 
        // sets how many times to try reconnecting
        reconnectTries: Number.MAX_VALUE,
        // sets the delay between every retry (milliseconds)
        reconnectInterval: 1000 
        } 
}
mongoose.connect(secrets.db, options);

经过一番尝试,依然没有解决上述问题。
现在主要的问题在于,我本地就没有这样的问题..

请教各位

阅读 7.8k
3 个回答

我做了如下的改动

var DB_URL = 'mongodb://username:password@host:port/databaseName';
var options = { 
    server: { 
        socketOptions: { 
            keepAlive: 1, 
            connectTimeoutMS: 30000 
        } ,
        reconnectTries:30,
        reconnectInterval:3000
    }, 
    replset: { 
        socketOptions: { 
            keepAlive: 1, 
            connectTimeoutMS: 30000 
        } 
    } 
}; 
// 连接数据库
mongoose.connect(DB_URL,options);

然后再也没有报过我问题中描述的错误。

这就是一个在断开连接的情况下操作db报的错误,
issue里面有很多这种问题,
看到有一个写的自动重连,希望能提供帮助

function createConnection (dbURL, options) {
    var db = mongoose.createConnection(dbURL, options);

    db.on('error', function (err) {
        // If first connect fails because mongod is down, try again later.
        // This is only needed for first connect, not for runtime reconnects.
        // See: https://github.com/Automattic/mongoose/issues/5169
        if (err.message && err.message.match(/failed to connect to server .* on first connect/)) {
            console.log(new Date(), String(err));

            // Wait for a bit, then try to connect again
            setTimeout(function () {
                console.log("Retrying first connect...");
                db.open(dbURL).catch(() => {});
                // Why the empty catch?
                // Well, errors thrown by db.open() will also be passed to .on('error'),
                // so we can handle them there, no need to log anything in the catch here.
                // But we still need this empty catch to avoid unhandled rejections.
            }, 20 * 1000);
        } else {
            // Some other error occurred.  Log it.
            console.error(new Date(), String(err));
        }
    });

    db.once('open', function () {
        console.log("Connection to db established.");
    });

    return db;
}

我之前碰到的问题是 断开网络 启动数据库就报错
最后把 地址 localhost 改成127.0.0.1好了。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏