这种错误的常见原因是你的代码中没有正确地配置MongoDB的复制集群.如果配置不正确,则写请求将不会写入有效的主节点中.
以下是两个示例,展示了该错误发生时如何进行解决.
示例1:
错误信息:
Write operation on node xxx:27017 failed: not master and slaveok=false
这种错误通常表示你的代码试图将写请求路由到错误的节点上,而这个错误的节点不是主节点.
示例代码:
const MongoClient = require('mongodb').MongoClient;
const mongoUri = 'mongodb://example.com:27017,example.com:27018,example.com:27019/test?replicaSet=rs0readPreference=secondary';
const client = new MongoClient(mongoUri, { useNewUrlParser: true })
client.connect((error, db) => {
if (error) {
console.log(+Master URI: ${result.primary}, node we're connecting to: ${mongoUri}+);
});
});
在示例代码中,我们使用MongoDB官方Node.js库连接到了复制集群,其中设置了replicaSet和readPreference参数,这允许我们在副本集中连接到一个辅助节点.我们使用命令adminDb.command({ isMaster: 1 } 来获取主节点的URI,如果没有错误,那么URI会被打印出来,否则会打印出错误消息.
MongoError: not master and slaveok=false
在解决这个问题时,将MongoDB的默认写关注点设置为主节点,可以避免在错误的节点上写入数据.
示例代码:
const MongoClient = require('mongodb').MongoClient;
const mongoUri = 'mongodb://example.com:27017,example.com:27018,example.com:27019/test?replicaSet=rs0readPreference=secondary';
const client = new MongoClient(mongoUri, { useNewUrlParser: true })
client.connect((error, db) => {
if (error) {
return;
}
// 设置主节点
db.command({ setParameter: 1, internalQueryExecMaxBlockingSortBytes: 335544320 });
});
通过以上两个示例,我们可以看出,在MongoDB中出现"not master and slaveok = false"错误时,需要修正配置文件,确保所有的写操作都路由到正确的主节点上.除此之外,还可以通过设置MongoDB的默认写关注点来避免这个错误.