fix: mongo 连接重试(容器编排 DNS 竞态导致启动循环重启)

This commit is contained in:
2026-09-13 00:33:46 +08:00
parent 430d125a18
commit 24f0e038eb
+52 -42
View File
@@ -1,42 +1,52 @@
const mongoose = require('mongoose') const mongoose = require('mongoose')
/** /**
* 数据库连接配置 * 数据库连接配置
*/ */
const connectDB = async () => { const connectDB = async () => {
try { // 容器编排下 mongo 可能晚于应用就绪(DNS EAI_AGAIN),带重试启动
const mongoURI = process.env.MONGODB_URI || const mongoURI = process.env.MONGODB_URI ||
`mongodb://${process.env.MONGODB_USER}:${process.env.MONGODB_PASSWORD}@${process.env.MONGODB_HOST}:${process.env.MONGODB_PORT}/${process.env.MONGODB_DB}?authSource=${process.env.MONGODB_DB}` `mongodb://${process.env.MONGODB_USER}:${process.env.MONGODB_PASSWORD}@${process.env.MONGODB_HOST}:${process.env.MONGODB_PORT}/${process.env.MONGODB_DB}?authSource=${process.env.MONGODB_DB}`
const MAX_RETRIES = 10
const conn = await mongoose.connect(mongoURI, { let conn = null
// Mongoose 6+ 不再需要这些选项,但保留以兼容旧版本 for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
// useNewUrlParser: true, try {
// useUnifiedTopology: true, conn = await mongoose.connect(mongoURI, {})
}) break
} catch (err) {
console.log(`✅ MongoDB 连接成功: ${conn.connection.host}:${conn.connection.port}/${conn.connection.name}`) console.warn(`MongoDB 连接失败(${attempt}/${MAX_RETRIES}):`, err.message)
if (attempt === MAX_RETRIES) {
// 连接事件监听 console.error('MongoDB 连接重试耗尽,进程退出')
mongoose.connection.on('error', (err) => { process.exit(1)
console.error('❌ MongoDB 连接错误:', err) }
}) await new Promise(r => setTimeout(r, 3000))
}
mongoose.connection.on('disconnected', () => { }
console.warn('⚠️ MongoDB 连接断开') try {
})
console.log(`✅ MongoDB 连接成功: ${conn.connection.host}:${conn.connection.port}/${conn.connection.name}`)
// 优雅关闭
process.on('SIGINT', async () => { // 连接事件监听
await mongoose.connection.close() mongoose.connection.on('error', (err) => {
console.log('🔌 MongoDB 连接已关闭') console.error('❌ MongoDB 连接错误:', err)
process.exit(0) })
})
mongoose.connection.on('disconnected', () => {
return conn console.warn('⚠️ MongoDB 连接断开')
} catch (error) { })
console.error('❌ MongoDB 连接失败:', error.message)
process.exit(1) // 优雅关闭
} process.on('SIGINT', async () => {
} await mongoose.connection.close()
console.log('🔌 MongoDB 连接已关闭')
module.exports = connectDB process.exit(0)
})
return conn
} catch (error) {
console.error('❌ MongoDB 连接失败:', error.message)
process.exit(1)
}
}
module.exports = connectDB