Я действительно запутался с опцией мангуста 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