Mongoose和autoReconnect选项难题

时间:2018-06-04 14:39:37

标签: node.js mongodb mongoose

我真的对autoReconnect方法中的mongoose mongoose.connect选项感到困惑。我的问题是我的服务器可能在数据库连接准备好之前启动,所以我必须在服务器代码的开头处理它。好吧,让我解释一下到现在为止:

首先,我尝试了记录的方式:

const db = mongoose.connection;
db.once('open', () => console.log('database connected'));
mongoose.connect(dbUri, { autoReconnect: true });

它有点工作,(mongo控制台显示:I NETWORK [listener] connection accepted from 127.0.0.1:52896 #1 (1 connection now open))但它从不调用open回调。但是,这个解决方案真的很奇怪db.readyState永远不会成为1(我认为这就是调用永远不会被调用的原因)。

之后,我搜索了一个解决方案并找到了其中的几个,包括heregithub。总结一下,这是基本的解决方案:

function connect() {
    mongoose.connect(dbUri, { autoReconnect: true });
}

const db = mongoose.connection;

db.once('open', () => console.log('database connected'));

db.on('error', () => {
    console.log('database connection error');
    mongoose.disconnect();
});

db.on('disconnected', () => {
    console.log('database disconnected.');
    connect();
});

connect();

同样,这个解决方案kida也可以工作,但这一次,每次调用connect()方法都会创建一个新连接,所以我的mongo控制台显示如下内容:

I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #5 (35 connections now open)
I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #6 (36 connections now open)
I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #7 (37 connections now open)
...

玩弄我发现那是因为autoReconnect选项。如果我将其设置为false(documentation确实不推荐),则在数据库准备就绪时进行单个连接。但我认为autoReconnect意味着不仅在建立连接时,而且在通过执行应用程序时它是活动的。

那么,我在这里错过了什么?在第一个例子中我应该做些什么吗?我是否保留autoReconnect并忽略多重连接?或者还有另一种我没找到的解决方案?

  • 节点:8.9.0
  • MongoDB:3.6.5
  • 猫鼬:5.0.11

0 个答案:

没有答案