2013-08-21 17 views
2

使用单一服务器设置,我从驱动程序接收事件。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');),关闭所有连接的集成员不会触发那些相同的事件。

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

我用猫鼬3.6.17(MongoDB的驱动程序1.3.18)

三世猫鼬,我想这与相同的结果(无论从副本集中的事件)。

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

回答

2

我一直有类似的问题,猫鼬,asked on SO也。最近,我在Mongoose GitHub存储库上发现this issue,导致驱动程序存储库上出现this issue

Mongo驱动程序不会多次发送任何这些事件,and today已修复单连接 on v1.3.19。
现在看来它是“不会修复”的。

+1

感谢您的回复。我确实试图通过强行断开连接和重新连接来缓解单一事件问题。这似乎工作,除了我的客户现在正在“连接被应用程序销毁”错误(这是有道理的)。所以1.3.19的修正是个好消息,至少对于单连接来说。 – MoatMonster

+0

我想我通过回答我自己的问题搞砸了。我想,我应该编辑原始问题。 – MoatMonster

0

最后我做了以下内容:

  1. 我设置auto_reconnect =真
  2. 直到应用程序已连接到数据库的第一次,我断开并重新连接。如果我不断开连接并重新连接,则任何排队的查询都不会运行。连接已经建立至少一次之后,那些排队做查询完成,然后...

单连接: 1.分叉猫鼬(使用MongoDB的到1.3.19),这样的错误被触发超过一旦。 2.捕捉连接错误,让应用程序知道断开连接,重试,直到我放弃和恐慌,或应用程序重新连接。如何这样做了就是通过ping服务器的命令每x毫秒不会排队:

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毫秒,直到我发现一个错误,在这种情况下,我将我的本地应用程序状态设置为断开连接,并进入上面(2.)的重新连接轮询循环。

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