#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
Драйвер завершится ошибкой при первом подключении, если он не сможет подключиться к хосту. Это сделано специально для обеспечения быстрого сбоя на недоступных хостах. Поведение повторного подключения запускается только после того, как драйвер выполнил первоначальное подключение.
Комментарии:
1. Да, я понял это позже… Спасибо за ответ. Чтобы в любом случае исправить мою проблему и, возможно, помочь другим людям, вот как я поступил: 1 / Я создал функцию, которая подключается к mongoose. 2 / При событии отключения я использовал тайм-аут, который вызывает функцию подключения. Это отлично работает для первой неудачной попытки, а затем параметры мангуста обрабатываются в случае потери соединения.