fix: mongo 连接重试(容器编排 DNS 竞态导致启动循环重启)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user