奇怪的 mongodb 和 mongoose 错误:不是 master 和 slaveOk=false 错误

Posted

技术标签:

【中文标题】奇怪的 mongodb 和 mongoose 错误:不是 master 和 slaveOk=false 错误【英文标题】:strange mongodb and mongoose error: not master and slaveOk=false error 【发布时间】:2015-07-17 07:17:36 【问题描述】:

我的 node.js 应用程序出现一个奇怪的错误

not master and slaveOk=false code 13435

我正在使用 mongoose 4.0.2 对 mongodb 3.0.1 进行 findOne 查询。该查询在今天早些时候运行。

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

【问题讨论】:

mongodb, replicates and error: "$err" : "not master and slaveOk=false", "code" : 13435 的可能重复 【参考方案1】:

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

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

更新: 正如 Janusz Slota 的评论所指出的,rs.slaveOk() 已不再使用。请改用rs.secondaryOk(),但仍然不建议这样做。这是rs.secondaryOk() 的文档。

【讨论】:

嗯,这听起来像是一个 mongohq 错误,因为我没有明确设置副本集 - 也许他们最终设置了一个。 很可能是这种情况。我不知道您使用的是哪个驱动程序,但我很确定它们都旨在自动检测和处理与副本集的连接。 slaveOK() 不再政治正确,使用secondaryOk()【参考方案2】:

我通过简单地修复我的 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 中添加副本集信息来解决问题。

【讨论】:

您将我的生产应用从负面评论中拯救出来的最好的 :) 是的,我需要&replicaSet=rs0&w=majority【参考方案3】:

我解决了这个问题(通过连接到 IBM 上的 mongoDB 实例)

mongoose.connect('mongodb://host1:port1/?replicaSet=rsName');

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

您可以在连接字符串中使用readPreference

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

当主要不允许您连接时,您可以使用次要首选项。

【讨论】:

这救了我的命【参考方案6】:

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

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

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

【讨论】:

这是有道理的。复制集数据库应该仅用于读取,所以在我看来这是最好的方法。

以上是关于奇怪的 mongodb 和 mongoose 错误:不是 master 和 slaveOk=false 错误的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 错误 mongoose 不会在数组 $pushAll 中推送对象

Node.js 和 MongoDB Atlas Mongoose 连接错误

MongoDB VS MySQL - 为啥 mongo/mongoose 会自动创建数据库和集合?

E11000 MongoDB/Mongoose 重复键错误

带有 Node.js 连接错误的 MongoDB (Mongoose) - 寻找洞察力

mongodb mongoose中的重复键错误索引