strange mongodb and mongoose error: not master and slaveOk=false error

strange mongodb and mongoose error: not master and slaveOk=false error

我的 node.js 应用出现奇怪的错误

not master and slaveOk=false code 13435

我正在使用 mongoose 4.0.2 执行 findOne 查询,遇到 mongodb 3.0.1。该查询在今天早些时候运行。

这是什么错误?我 运行 在 mongohq 上按他们的标准每 gb 计划。

这意味着您正在尝试从副本集中的辅助节点读取,默认情况下您只能从主节点读取。

您可以允许辅助节点在连接到该辅助节点的 mongo shell 中接受 运行 rs.slaveOk() 的读取。不建议允许从辅助节点读取,因为如果节点尚未与主节点同步,您可能正在读取陈旧数据。

更新: 正如 Janusz Slota 的评论所指出的,rs.slaveOk() 不再使用。使用 rs.secondaryOk() 代替,但是仍然不推荐这样做。这是 rs.secondaryOk().

的文档

这对我适用于 mongoose 4.x 和 mongodb 3.0.x:

model.find().read('secondary').....

http://mongoosejs.com/docs/api.html#query_Query-read

我通过简单地修复我的 Node.js 应用程序使用 Mongoose 连接到 MongoDB 的 URI 解决了这个问题。

发生此错误时,我的 URI 是

mongodb://user:password@host:port/datatabase,

这给了我错误 not master and slaveOK=false

然后我修改了URI,加入了Replica Set的信息,URI变成了这样:

mongodb://user:password@host:port,replicaSetHost:replicaSetPort/database?replicaSet=rs-someServer.

现在,我不知道这是否是一种通用模式,因为此配置是 MongoLab 使用的配置,它是托管我的数据库的地方。但是,您也可以通过在 URI 中添加副本集信息来解决问题。

很可能您的主节点出现故障,您正在尝试从从节点读取数据,但默认情况下(以及数据同步等安全措施)您的读取源仅设置为主节点。

您可以在连接字符串的末尾附加选项,例如 ?readPreference=secondary 将使用辅助连接

我用

解决了这个问题(通过连接到 IBM 上的 mongoDB 实例而发生)
mongoose.connect('mongodb://host1:port1/?replicaSet=rsName');

发件人:https://mongoosejs.com/docs/connections.html#replicaset_connections

您可以使用 readPreference 连接字符串。

mongodb://localhost:27017/?readPreference=seconday&directConnection=true&ssl=false

当主要不允许您连接时,您可以使用次要偏好。