Не удается подключиться к базе данных MongoDB с помощью собственного драйвера NodeJS

У меня есть приложение NodeJS, в котором мне нужно подключиться к базам данных MongoDB — одна настроена на один сервер, а вторая — на набор реплик. К следующему подключаюсь нормально, но при подключении ко второму получаю следующую ошибку:

/Users/iddogino/Documents/RapidApp/node_modules/mongodb/lib/mongodb/db.js:299
          throw err;
                ^
TypeError: Cannot set property 'auto_reconnect' of undefined
    at /Users/iddogino/Documents/RapidApp/node_modules/mongodb/lib/mongodb/connection/repl_set/options.js:110:35
    at Array.forEach (native)
    at Options.decorateAndClean (/Users/iddogino/Documents/RapidApp/node_modules/mongodb/lib/mongodb/connection/repl_set/options.js:108:16)
    at new exports.ReplSet (/Users/iddogino/Documents/RapidApp/node_modules/mongodb/lib/mongodb/connection/repl_set/repl_set.js:84:31)
    at /Users/iddogino/Documents/RapidApp/node_modules/mongodb/lib/mongodb/mongo_client.js:320:30
    at /Users/iddogino/Documents/RapidApp/node_modules/mongodb/lib/mongodb/db.js:296:11
    at process._tickDomainCallback (node.js:459:13)

Код, который я использую для подключения (после исключения имен пользователей и реальных URL-адресов):

require('mongodb').MongoClient.connect("mongodb://password@url1:port1,url2:port2/dbName?replicaSet=setName&w=0&readPreference=secondary", function(err, doc) {...});

Теперь, когда я попробовал это в одиночку (не после того, как код подключился к настоящей другой БД), я работал просто отлично... Есть идеи?


person byteSlayer    schedule 08.02.2015    source источник
comment
Проблема заключается в том, что код ссылается на свойство auto_reconnect некоторой переменной, значение которой равно undefined. Где такое могло произойти в вашем коде? Можете ли вы опубликовать части кода, связанные с auto_reconnect?   -  person wdberkeley    schedule 10.02.2015


Ответы (1)


Это заняло у меня минуту, чтобы понять. Ошибка говорит, что проблема в ./node_modules/mongodb/lib/mongodb/connection/repl_set/options.js:110

Проблема в том, что options.js:91 создает пустой объект. Они делают это, создают словарь и дедуплицируют строки «хост: порт» для серверов. options.js:104 перебирает ключи в этом словаре и вслепую загружает их в массив. Это было бы проблемой, если бы вы добавили что-то в Object.prototype глобально, так как это также было бы добавлено в окончательный массив серверов. Поскольку все, что вы добавили в Object.prototype, вероятно, не является сервером, у него не будет свойства options, и вы получите эту ошибку.

Обходной путь: выясните, где в вашем коде вы изменили Object.prototype и сделайте его менее общим. Я думаю, что они обновили это в более новых версиях драйвера, но если вы используете старую, вам нужно обойти это.

person Brandon Hamric    schedule 14.05.2015