Странная ошибка mongodb и mongoose: не master и slaveOk = ложная ошибка
Я получаю странную ошибку в моем node.js приложении
not master and slaveOk=false code 13435
Я делаю запрос findOne, используя mongoose 4.0.2, ударяющий mongodb 3.0.1. Запрос работал уже сегодня.
Что это за ошибка? Я работаю на mongohq по их стандарту на план gb.
Ответы
Ответ 1
Это означает, что вы пытаетесь читать из вторичного node в наборе реплик, по умолчанию вы можете читать только с основного node.
Вы можете разрешить второму node принимать чтения, запустив rs.slaveOk()
в оболочке mongo, которая подключена к этому вторичному node. Разрешить чтение из вторичного не рекомендуется, потому что вы можете читать устаревшие данные, если node еще не синхронизирован с основным node.
Ответ 2
Я решил эту проблему, просто исправив URI, который использовалось моим приложением Node.js для подключения к MongoDB с помощью Mongoose.
Когда произошла эта ошибка, мой URI был
mongodb://user:[email protected]:port/datatabase
,
и это давало мне ошибку не master а slaveOK = false.
Затем я изменил URI, чтобы добавить информацию о наборе реплик, и URI стал примерно таким:
mongodb://user:[email protected]:port,replicaSetHost:replicaSetPort/database?replicaSet=rs-someServer
.
Теперь, я не знаю, является ли это общим шаблоном, потому что эта конфигурация используется MongoLab, где находится моя база данных. Однако, скорее всего, вы решите проблему, добавив информацию о наборе реплик в URI.
Ответ 3
Вероятно, произошел сбой вашего главного узла, и вы пытаетесь читать с подчиненного узла, но по умолчанию (и правила безопасности, такие как синхронизация данных) ваш источник чтения установлен только на основной узел.
Вы можете прикрепить опции в конце строки вашего соединения, например ?readPreference=secondary
который будет использовать вторичное соединение
Ответ 4
Это работает для меня на mongoose 4.x и mongodb 3.0.x:
model.find().read('secondary').....
см. http://mongoosejs.com/docs/api.html#query_Query-read
Ответ 5
Я решил проблему (произошло, подключившись к экземпляру mongoDB в IBM) с
mongoose.connect('mongodb://host1:port1/?replicaSet=rsName');
От: https://mongoosejs.com/docs/connections.html#replicaset_connections