我在node.js应用中遇到了一个奇怪的错误
main
我正在使用mongoose 4.0.2点击mongodb 3.0.1进行findOne查询。该查询今天早些时候正在运行。
这是什么错误?我按照他们的标准每gb计划在mongohq上运行。
答案 0 :(得分:32)
这意味着您尝试从副本集中的辅助节点进行读取,默认情况下只能从主节点读取。
您可以通过在连接到该辅助节点的mongo shell中运行ArrayList
来允许辅助节点接受读取。不建议允许从辅助节点读取,因为如果节点尚未与主节点同步,则可能正在读取陈旧数据。
答案 1 :(得分:13)
我通过简单地修复我的Node.js用于连接到Mongoose的MongoDB的URI来解决这个问题。
当出现此错误时,我的URI是
mongodb://user:password@host:port/datatabase
,
这给了我错误 not master and slaveOK = false 。
然后我更改了URI以添加副本集信息,并且URI变为如下所示:
mongodb://user:password@host:port,replicaSetHost:replicaSetPort/database?replicaSet=rs-someServer
。
现在,我不知道这是否是一般模式,因为这个配置是MongoLab使用的配置,也就是托管我的DataBase的地方。但是,您可能也会通过在URI中添加副本集信息来解决问题。
答案 2 :(得分:3)
您的主节点可能会失败并且您正在尝试从从属节点读取,但默认情况下(以及数据同步等安全措施)您的读取源仅设置为主节点。
您可以在连接字符串的末尾附加选项,例如
?readPreference=secondary
将使用辅助连接
答案 3 :(得分:2)
这适用于mongoose 4.x和mongodb 3.0.x:
model.find().read('secondary').....
答案 4 :(得分:2)
我解决了问题(通过连接到IBM上的mongoDB实例而发生)
mongoose.connect('mongodb://host1:port1/?replicaSet=rsName');
发件人:https://mongoosejs.com/docs/connections.html#replicaset_connections