如何检测MongoDB重连失败事件(基于Node.js MongoDB驱动)
Node.js MongoDB驱动:重连配置与状态监听全指南
我来帮你梳理下当前Node.js MongoDB驱动的重连配置和状态监听实现,结合你的需求补充完整的事件处理逻辑:
你的连接配置解析
你当前的连接选项已经设置了非常实用的超时与重连规则,我帮你拆解下每个参数的作用:
connectTimeoutMS: 30000:设置连接建立的超时时间,30秒内无法建立连接则判定初始连接失败socketTimeoutMS: 30000:Socket通信超时阈值,30秒内未收到MongoDB的响应就会断开当前连接reconnectTries: 120:驱动最多尝试120次重连reconnectInterval: 1000:每次重连前等待1秒,算下来总重连窗口是2分钟(120*1秒)
完整的配置代码示例:
const { MongoClient } = require('mongodb'); // 你的连接配置 const connectionOptions = { connectTimeoutMS: 30000, socketTimeoutMS: 30000, reconnectTries: 120, reconnectInterval: 1000 }; // 建立连接 MongoClient.connect('mongodb://your-mongo-host:27017/your-db-name', connectionOptions, (err, client) => { if (err) { console.error('初始连接MongoDB失败:', err); return; } const db = client.db('your-db-name'); // 在这里绑定状态监听事件 });
完整的状态监听事件实现
你已经添加了close事件监听,但要覆盖重连的全流程,还需要补充几个关键事件的处理:
1. close 事件:连接断开触发
当连接意外断开或被主动关闭时触发,适合在这里记录断开日志或触发告警:
db.on('close', () => { console.warn('⚠️ MongoDB连接已断开,驱动即将启动重连流程'); // 可选:发送告警通知到运维系统 });
2. error 事件:连接/操作错误触发
任何连接相关的错误(包括重连过程中的中间失败)都会触发这个事件,注意不要在这里直接终止进程,否则会打断重连逻辑:
db.on('error', (err) => { console.error('❌ MongoDB连接错误:', err.message); // 针对特定错误类型做提示 if (err.message.includes('ECONNREFUSED')) { console.warn('⚠️ MongoDB服务暂时不可达,驱动正在重试连接'); } });
3. reconnect 事件:重连成功触发
当驱动成功重新建立连接时触发,适合在这里记录恢复日志或恢复业务流程:
db.on('reconnect', () => { console.info('✅ MongoDB连接已重新建立,业务可恢复正常'); // 可选:重启之前暂停的定时任务、消息消费等业务逻辑 });
4. reconnectFailed 事件:重连全部失败触发
当达到reconnectTries设定的次数仍未成功重连时触发,这时候需要执行降级或紧急处理逻辑:
db.on('reconnectFailed', () => { console.error('💥 MongoDB重连失败,已达最大重试次数!'); // 可选:切换到备用存储、触发运维紧急告警、启动服务降级逻辑 });
生产环境注意事项
- 避免在
error事件中调用process.exit():这会直接终止进程,导致驱动无法继续执行重连 - 新版本驱动兼容提示:如果你使用MongoDB驱动3.0+版本,
reconnectTries和reconnectInterval已被标记为废弃,推荐使用autoReconnect: true配合serverSelectionTimeoutMS,或者启用retryWrites等新特性 - 日志监控:建议将这些状态事件的日志接入你的监控系统,方便实时排查连接问题
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

