fix: mongo 连接重试(容器编排 DNS 竞态导致启动循环重启)
This commit is contained in:
@@ -1,42 +1,52 @@
|
||||
const mongoose = require('mongoose')
|
||||
|
||||
/**
|
||||
* 数据库连接配置
|
||||
*/
|
||||
const connectDB = async () => {
|
||||
try {
|
||||
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}`
|
||||
|
||||
const conn = await mongoose.connect(mongoURI, {
|
||||
// Mongoose 6+ 不再需要这些选项,但保留以兼容旧版本
|
||||
// useNewUrlParser: true,
|
||||
// useUnifiedTopology: true,
|
||||
})
|
||||
|
||||
console.log(`✅ MongoDB 连接成功: ${conn.connection.host}:${conn.connection.port}/${conn.connection.name}`)
|
||||
|
||||
// 连接事件监听
|
||||
mongoose.connection.on('error', (err) => {
|
||||
console.error('❌ MongoDB 连接错误:', err)
|
||||
})
|
||||
|
||||
mongoose.connection.on('disconnected', () => {
|
||||
console.warn('⚠️ MongoDB 连接断开')
|
||||
})
|
||||
|
||||
// 优雅关闭
|
||||
process.on('SIGINT', async () => {
|
||||
await mongoose.connection.close()
|
||||
console.log('🔌 MongoDB 连接已关闭')
|
||||
process.exit(0)
|
||||
})
|
||||
|
||||
return conn
|
||||
} catch (error) {
|
||||
console.error('❌ MongoDB 连接失败:', error.message)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = connectDB
|
||||
const mongoose = require('mongoose')
|
||||
|
||||
/**
|
||||
* 数据库连接配置
|
||||
*/
|
||||
const connectDB = async () => {
|
||||
// 容器编排下 mongo 可能晚于应用就绪(DNS EAI_AGAIN),带重试启动
|
||||
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}`
|
||||
const MAX_RETRIES = 10
|
||||
let conn = null
|
||||
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
||||
try {
|
||||
conn = await mongoose.connect(mongoURI, {})
|
||||
break
|
||||
} catch (err) {
|
||||
console.warn(`MongoDB 连接失败(${attempt}/${MAX_RETRIES}):`, err.message)
|
||||
if (attempt === MAX_RETRIES) {
|
||||
console.error('MongoDB 连接重试耗尽,进程退出')
|
||||
process.exit(1)
|
||||
}
|
||||
await new Promise(r => setTimeout(r, 3000))
|
||||
}
|
||||
}
|
||||
try {
|
||||
|
||||
console.log(`✅ MongoDB 连接成功: ${conn.connection.host}:${conn.connection.port}/${conn.connection.name}`)
|
||||
|
||||
// 连接事件监听
|
||||
mongoose.connection.on('error', (err) => {
|
||||
console.error('❌ MongoDB 连接错误:', err)
|
||||
})
|
||||
|
||||
mongoose.connection.on('disconnected', () => {
|
||||
console.warn('⚠️ MongoDB 连接断开')
|
||||
})
|
||||
|
||||
// 优雅关闭
|
||||
process.on('SIGINT', async () => {
|
||||
await mongoose.connection.close()
|
||||
console.log('🔌 MongoDB 连接已关闭')
|
||||
process.exit(0)
|
||||
})
|
||||
|
||||
return conn
|
||||
} catch (error) {
|
||||
console.error('❌ MongoDB 连接失败:', error.message)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = connectDB
|
||||
|
||||
Reference in New Issue
Block a user