Странная ошибка 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 который будет использовать вторичное соединение