MongooseJS应该在副本集断开连接上发送事件吗?

使用单个服务器设置,我从驱动程序接收事件。

mongoose.connect('mongodb://localhost/mydb'); mongoose.connection.on('disconnected', function() {...}); mongoose.connection.on('error', function(err) {...}); 

当使用副本集( mongoose.connect('mongodb://localhost:27017/mydb,mongodb://localhost:27018/mydb'); )时,closures所有连接的集成员不会触发相同的事件。

我不是很熟悉的本地驱动程序的内部,我想知道这是一个错误,或者如果我需要手动检测到这种情况。

我正在使用Mongoose 3.6.17(mongodb驱动程序1.3.18)

Sans mongoose,我试着用相同的结果(没有来自副本集的事件)。

 require('mongodb').MongoClient.connect("mongodb://localhost:27017,localhost:27018/mydb", function(err, db) { if (db) { db.on('disconnected', function() { console.log('disconnected'); }).on('error', function(err) { console.log('error'); }); } }); 

我也遇到过与mongoose类似的问题。 最近,我在Mongoose GitHub存储库上发现了这个问题 ,导致驱动程序库上出现这个问题 。

Mongo驱动程序不是不止一次地发送这些事件, 而今天这个在v1.3.19上被固定为单个连接
看来,这是一个“现在不能解决”的问题。

我结束了以下工作:

  1. 我设置了auto_reconnect = true
  2. 在应用程序第一次连接到数据库之前,我断开并重新连接。 如果我不断开和重新连接,任何排队查询将不会运行。 连接build立至less一次后,这些排队查询完成,然后…

对于单一的连接:1.叉状mongoose(使用mongodb 1.3.19),所以错误触发不止一次。 2.捕捉连接错误,使应用程序意识到断开,重试,直到我放弃和恐慌或应用程序重新连接。 如何做是通过一个不会排队的命令每隔x毫秒来ping服务器:

 var autoReconnect = mongoose.connection.db.serverConfig.isAutoReconnect; mongoose.connection.db.serverConfig.isAutoReconnect = function(){return false;}; mongoose.connection.db.executeDbCommand({ping:1}, {failFast: true}, function(err) { if (!err) { // we've reconnected. } }); mongoose.connection.db.serverConfig.isAutoReconnect = autoReconnect; 

对于一个副本集,我结束了每隔x毫秒轮询上述ping的mongoose连接,直到我检测到一个错误,在这种情况下,我设置我的本地应用程序状态断开连接并进入上面的重新连接轮询循环(2.)。

这里有一些相关的要点。 https://gist.github.com/jsas/6299412