我真的对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
(我认为这就是调用永远不会被调用的原因)。
之后,我搜索了一个解决方案并找到了其中的几个,包括here和github。总结一下,这是基本的解决方案:
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
并忽略多重连接?或者还有另一种我没找到的解决方案?