奇怪的 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 会自动创建数据库和集合?