正如 Rafael 提到的,副本集需要奇数个成员才能在某些成员离线时正常运行。副本集选举文档页面中有更多详细信息,但最相关的是:
如果当前主节点无法访问或无法访问大部分副本集,则主节点将退出并成为辅助节点。发生这种情况后,副本集将无法接受写入,但如果将此类查询配置为在辅助节点上运行,其余成员可以继续为读取查询提供服务。
默认情况下,节点驱动程序需要 Primary 在线才能连接到副本集,并且当您尝试连接到没有 Primary 的副本集时会输出您观察到的错误。
可以通过设置connectWithNoPrimary
来更改此默认行为true
。但是,为了能够进行查询,您还应该设置正确的readPreference
设置(也默认为 Primary)。例如:
var MongoClient = require('mongodb').MongoClient
conn = MongoClient.connect('mongodb://localhost:27017,localhost:27018,localhost:27019/test',
{
replicaSet: 'replset',
connectWithNoPrimary: true,
readPreference: 'primaryPreferred'
}).catch(console.log)
有关连接选项的更多信息,请参见节点驱动程序 URI 连接设置页面