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

发布于 2022-09-05 15:29:08 字数 926 浏览 9 评论 0

问题描述:

我在我的电脑开启了一个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);

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

请教各位

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你曾走过我的故事 2022-09-12 15:29:10

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

魔法少女 2022-09-12 15:29:09

我做了如下的改动

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);

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

执手闯天涯 2022-09-12 15:29:09

这就是一个在断开连接的情况下操作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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文