mongodb db.open()返回replicaset错误但mongodb日志文件中没有错误

时间:2014-08-01 14:18:22

标签: node.js mongodb

NodeJS版本:v0.10.29 Mongo版本:2.6.3 NodeJS mongodb模块:1.4.5

我们在回调db.open

时遇到以下错误

“错误:找不到有效的replicaset实例服务器”

mongodb似乎工作正常,mongodb日志中没有错误。重新启动nodejs服务器可以解决问题。

2 个答案:

答案 0 :(得分:3)

来自https://github.com/HabitRPG/habitrpg/issues/2725

  

Node驱动程序的一个奇怪之处是默认设置   副本集连接的超时仅为1秒,因此请确保   你将它设置为更像30s的东西,如下例所示:

{ 
   options: { 
      replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }, 
      server: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } } 
   } 
}

我认为他们认为这些是与MongoClient()一起使用的选项。

答案 1 :(得分:2)

我在同时启动MongoDB集群和Node.js时看到了这个错误。

由于MongoDB副本集需要在启动时选择主要活动并执行其他握手活动,这可能会导致可用于连接的MongoDB实例出现延迟。使您描述的问题更有可能发生。

增加连接上的超时值,如rakslice的回答详细信息,可以防止这种情况发生。

有关连接超时设置和说明的官方MongoDB文档值得参考:

在这里添加rakslice的答案是一个完整的示例,说明如何连接到设置了连接超时值的replset:

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017,localhost:27017,localhost:27017/test", 
        {
            replset: { 
                socketOptions: { 
                    connectTimeoutMS: 30000 
                } 
            },
            server: {
                    socketOptions: {
                        connectTimeoutMS: 500
                    }
                }
        }, 
        function(err, db) {
                if (err) throw err;

                db.collection("things").find({}).toArray(function(err, docs) {
                    if (err) throw err; 

                console.log(docs);
                    db.close();         
                });
        }
);

一篇很好的文章,其中涉及一些影响&设置特定超时值的决定: