NodeJS版本:v0.10.29 Mongo版本:2.6.3 NodeJS mongodb模块:1.4.5
我们在回调db.open
时遇到以下错误“错误:找不到有效的replicaset实例服务器”
mongodb似乎工作正常,mongodb日志中没有错误。重新启动nodejs服务器可以解决问题。
答案 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();
});
}
);
一篇很好的文章,其中涉及一些影响&设置特定超时值的决定: