странная ошибка mongodb и мангуста: не мастер и slaveOk=ложная ошибка

Я получаю странную ошибку в моем узле.приложение на JS

not master and slaveOk=false code 13435

Я делаю запрос findOne, используя mongoose 4.0.2, нажимая mongodb 3.0.1. Запрос работал сегодня утром.

что это за ошибка? Я работаю на mongohq по их стандартному плану на Гб.

4 ответов


это означает, что вы пытаетесь читать из вторичного узла в наборе реплик, вы можете читать только из первичного узла по умолчанию.

вы можете разрешить вторичному узлу принимать чтения, запустив rs.slaveOk() в оболочке mongo, которая подключена к этому вторичному узлу. Не рекомендуется разрешать чтение из вторичного узла, поскольку вы можете считывать устаревшие данные, если узел еще не синхронизирован с первичным узлом.


Я решил это, просто исправив URI мой узел.js использовал для подключения к MongoDB с Мангустом.

когда эта ошибка ocurred, мой URI был

mongodb://user:password@host:port/datatabase,

и это дает мне ошибку не мастер и slaveOK=ложь.

затем я изменил URI, чтобы добавить информацию о наборе реплик, и URI стал чем-то вроде этого:

mongodb://user:password@host:port,replicaSetHost:replicaSetPort/database?replicaSet=rs-someServer.

теперь я не знаю, является ли это общим шаблоном, потому что эта конфигурация используется MongoLab, где размещается моя база данных. Тем не менее, вероятно, вы решите проблему, добавив информацию о наборе реплик в URI.


это работает для меня на мангусте 4.x и mongodb 3.0.x:

model.find().read('secondary').....

см.http://mongoosejs.com/docs/api.html#query_Query-read


вероятно, ваш главный узел не удался, и вы пытаетесь читать с ведомого узла, но по умолчанию (и практика безопасности, такая как синхронизация данных) ваш источник чтения установлен только на первичный узел. Вы можете прикрепить параметры в конце строки подключения, такие как '?readPreference=secondary', если, например, используется узел.