提问者:小点点

猫鼬心跳和重新连接不起作用


本机嵌入在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

我真的迷路了。我怀疑这是猫鼬代码没有工作,这必然是我的实现。

你能帮我吗?


共1个答案

匿名用户

这是mongodb驱动程序的预期行为

https://jira.mongodb.org/browse/node-834?focusedcommentid=1412582&page=com.atlassian.jira.plugin.system.issuetabpanels%3acomment-tabpanel#comment-1412582

如果驱动程序无法连接到主机,它将在第一次连接时失败。这样做的目的是确保在无法访问的主机上快速失败。重新连接行为仅在驱动程序执行了初始连接后才开始。