Сердцебиение мангуста и переподключение не работают

#javascript #node.js #mongodb #express #mongoose

#javascript #node.js #mongodb #выразить #мангуст

Вопрос:

функция автоматического повторного подключения, изначально встроенная в mongoose, не работает в моем проекте.

На самом деле я получаю возврат с ошибкой, но он не запускается снова через X секунд, которые я настроил.

Помимо того, верны учетные данные или нет, я ожидаю, что mongoose будет пытаться входить в систему каждые X секунд (и, следовательно, каждый раз отправлять мне журнал), но это не так

Вот документ, о котором идет речь:https://mongoosejs.com/docs/connections.html#options

Вот мой код:

 import mongoose from "mongoose"

const options = {
    dbName: "testbdd",
    pass: "qwe",
    user: "alex",
    useNewUrlParser: true,
    serverSelectionTimeoutMS: 1000,
    heartbeatFrequencyMS: 1000,
    useUnifiedTopology: true
}
const uri = `mongodb://localhost/`



mongoose.connection.on('disconnected', function () {
    console.log('Mongo db disconnected!');
});

mongoose.connect(uri, options).then(() => {
    console.log('First Mongo db connexion success !')
}).catch((error) => {
    console.log('First Mongo db connexion fail !')
    console.log(error)
})
  

Вот результат, когда я запускаю сервер узла:

 backend_1  | Mongo db disconnected!
backend_1  | First Mongo db connexion fail !
backend_1  | MongooseServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
backend_1  |     at NativeConnection.Connection.openUri (/user/app/node_modules/mongoose/lib/connection.js:800:32)
backend_1  |     at /user/app/node_modules/mongoose/lib/index.js:341:10
backend_1  |     at /user/app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:5
backend_1  |     at new Promise (<anonymous>)
backend_1  |     at promiseOrCallback (/user/app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:30:10)
backend_1  |     at Mongoose.connect (/user/app/node_modules/mongoose/lib/index.js:340:10)
backend_1  |     at Object.connect (/user/app/src/db/mongo/index.js:28:10)
backend_1  |     at Module._compile (internal/modules/cjs/loader.js:776:30)
backend_1  |     at Module._compile (/user/app/node_modules/pirates/lib/index.js:99:24)
backend_1  |     at Module._extensions..js (internal/modules/cjs/loader.js:787:10)
backend_1  |     at Object.newLoader [as .js] (/user/app/node_modules/pirates/lib/index.js:104:7)
backend_1  |     at Module.load (internal/modules/cjs/loader.js:643:32)
backend_1  |     at Function.Module._load (internal/modules/cjs/loader.js:556:12)
backend_1  |     at Module.require (internal/modules/cjs/loader.js:683:19)
backend_1  |     at require (internal/modules/cjs/helpers.js:16:16)
backend_1  |     at Object.require (/user/app/src/bin/www.js:7:1) {
backend_1  |   message: 'connect ECONNREFUSED 127.0.0.1:27017',
backend_1  |   reason: TopologyDescription {
backend_1  |     type: 'Single',
backend_1  |     setName: null,
backend_1  |     maxSetVersion: null,
backend_1  |     maxElectionId: null,
backend_1  |     servers: Map { 'localhost:27017' => [ServerDescription] },
backend_1  |     stale: false,
backend_1  |     compatible: true,
backend_1  |     compatibilityError: null,
backend_1  |     logicalSessionTimeoutMinutes: null,
backend_1  |     heartbeatFrequencyMS: 1000,
backend_1  |     localThresholdMS: 15,
backend_1  |     commonWireVersion: null
backend_1  |   }
backend_1  | }
  

Эти параметры должны хорошо работать, нет?

 serverSelectionTimeoutMS: 1000,
heartbeatFrequencyMS: 1000,
useUnifiedTopology: true
  

Я действительно заблудился. Я сомневаюсь, что это код mongoose, который не работает, это обязательно моя реализация.

Вы можете мне помочь ?

Ответ №1:

Это предполагаемое поведение драйвера mongodb

https://jira.mongodb.org/browse/NODE-834?focusedCommentId=1412582amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-1412582

Драйвер завершится ошибкой при первом подключении, если он не сможет подключиться к хосту. Это сделано специально для обеспечения быстрого сбоя на недоступных хостах. Поведение повторного подключения запускается только после того, как драйвер выполнил первоначальное подключение.

Комментарии:

1. Да, я понял это позже… Спасибо за ответ. Чтобы в любом случае исправить мою проблему и, возможно, помочь другим людям, вот как я поступил: 1 / Я создал функцию, которая подключается к mongoose. 2 / При событии отключения я использовал тайм-аут, который вызывает функцию подключения. Это отлично работает для первой неудачной попытки, а затем параметры мангуста обрабатываются в случае потери соединения.