Мангуст и загадка опции автоподключения - PullRequest
0 голосов
/ 04 июня 2018

Я действительно запутался с опцией мангуста autoReconnect внутри mongoose.connect методов.Моя проблема в том, что мой сервер может запуститься до того, как соединение с базой данных будет готово, поэтому я должен обработать это в начале кода моего сервера.Что ж, позвольте мне объяснить, что у меня есть до сих пор:

Сначала я попробовал документированный способ:

const db = mongoose.connection;
db.once('open', () => console.log('database connected'));
mongoose.connect(dbUri, { autoReconnect: true });

Это вроде работает (консоль монго показывает: I NETWORK [listener] connection accepted from 127.0.0.1:52896 #1 (1 connection now open)), но никогдавызывает open обратный вызов.Что действительно странно в этом решении, так это то, что db.readyState никогда не станет 1 (что, я полагаю, является причиной того, что обратный вызов никогда не вызывается).

После этого я искал решение и нашел несколькоих, в том числе здесь и github .Подводя итог, вот базовое решение:

function connect() {
    mongoose.connect(dbUri, { autoReconnect: true });
}

const db = mongoose.connection;

db.once('open', () => console.log('database connected'));

db.on('error', () => {
    console.log('database connection error');
    mongoose.disconnect();
});

db.on('disconnected', () => {
    console.log('database disconnected.');
    connect();
});

connect();

Опять же, это решение kida тоже работает, но на этот раз каждый вызов метода connect() создает новое соединение, так что моя консоль Монго показываетчто-то вроде:

I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #5 (35 connections now open)
I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #6 (36 connections now open)
I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #7 (37 connections now open)
...

Играя вокруг, я обнаружил, что это из-за опции autoReconnect.Если я установил его в false (что на самом деле не рекомендуется в документации ), то, когда база данных готова, устанавливается одно соединение.Но я думаю, что autoReconnect означает сделать это не только при установлении соединения, но и при активном выполнении приложения.

Итак, что мне здесь не хватает?Есть ли что-то, что я должен делать в первом примере?Я сохраняю autoReconnect и игнорирую функцию множественного соединения?Или есть другое решение, которое я не нашел?

  • Узел: 8.9.0
  • MongoDB: 3.6.5
  • Mongoose: 5.0.11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...