Files
jiebanke/backend/src/server.js

172 lines
6.5 KiB
JavaScript
Raw Normal View History

2025-08-30 14:33:49 +08:00
require('dotenv').config()
const app = require('./app')
const { testConnection } = require('./config/database')
const redisConfig = require('./config/redis')
const rabbitMQConfig = require('./config/rabbitmq')
const PORT = process.env.PORT || 3000
const HOST = process.env.HOST || '0.0.0.0'
// 显示启动横幅
console.log('========================================')
console.log('🚀 服务器启动中...')
console.log(`📅 时间: ${new Date().toISOString()}`)
console.log(`📌 版本: 1.0.0`)
console.log('========================================\n')
// 显示环境信息
console.log('🔍 环境配置:')
console.log(`🔹 NODE_ENV: ${process.env.NODE_ENV || 'development'}`)
console.log(`🔹 PORT: ${PORT}`)
console.log(`🔹 HOST: ${HOST}`)
console.log(`🔹 DATABASE_URL: ${process.env.DATABASE_URL ? '已配置' : '未配置'}`)
console.log(`🔹 REDIS_URL: ${process.env.REDIS_URL ? '已配置' : '未配置'}`)
console.log(`🔹 RABBITMQ_URL: ${process.env.RABBITMQ_URL ? '已配置' : '未配置'}\n`)
// 优雅关闭处理
process.on('uncaughtException', (err) => {
console.error('========================================')
console.error('❌ 未捕获的异常:')
console.error(`🔹 消息: ${err.message}`)
console.error(`🔹 堆栈: ${err.stack}`)
console.error('========================================')
process.exit(1)
})
process.on('unhandledRejection', (err) => {
console.error('========================================')
console.error('❌ 未处理的Promise拒绝:')
console.error(`🔹 消息: ${err.message}`)
console.error(`🔹 堆栈: ${err.stack}`)
console.error('========================================')
process.exit(1)
})
// 启动服务器
const startServer = async () => {
try {
console.log('\n========================================')
console.log('🔍 正在初始化服务...')
console.log('========================================\n')
console.log('🔍 测试数据库连接...')
// 测试数据库连接
await testConnection()
console.log('✅ 数据库连接测试成功')
console.log('📌 数据库连接池配置:', {
host: process.env.DB_HOST,
port: process.env.DB_PORT,
database: process.env.DB_NAME,
user: process.env.DB_USER
})
// 连接Redis可选
try {
console.log('\n🔍 初始化Redis连接...')
console.log(`📌 Redis配置: ${process.env.REDIS_URL || '使用默认配置'}`)
await redisConfig.connect()
console.log('✅ Redis连接成功')
const info = await redisConfig.getInfo()
console.log('📌 Redis服务器信息:', info.server)
console.log('📌 Redis内存信息:', info.memory)
} catch (error) {
console.warn('⚠️ Redis连接失败继续以无缓存模式运行')
console.warn(`🔹 错误详情: ${error.message}`)
}
// 连接RabbitMQ可选
try {
console.log('\n🔍 初始化RabbitMQ连接...')
console.log(`📌 RabbitMQ配置: ${process.env.RABBITMQ_URL || '使用默认配置'}`)
await rabbitMQConfig.connect()
console.log('✅ RabbitMQ连接成功')
const connInfo = rabbitMQConfig.getConnectionInfo()
console.log('📌 RabbitMQ连接信息:', connInfo)
} catch (error) {
console.warn('⚠️ RabbitMQ连接失败继续以无消息队列模式运行')
console.warn(`🔹 错误详情: ${error.message}`)
}
// 启动HTTP服务器
console.log('\n🔍 启动HTTP服务器...')
const server = app.listen(PORT, HOST, () => {
console.log('========================================')
console.log('✅ 服务器启动成功!')
console.log(`🚀 访问地址: http://${HOST}:${PORT}`)
console.log(`📊 环境: ${process.env.NODE_ENV || 'development'}`)
console.log(`⏰ 启动时间: ${new Date().toLocaleString()}`)
console.log('💾 数据库: MySQL')
console.log(`🔴 Redis: ${redisConfig.isConnected() ? '已连接' : '未连接'}`)
console.log(`🐰 RabbitMQ: ${rabbitMQConfig.isConnected() ? '已连接' : '未连接'}`)
console.log('========================================\n')
})
// 优雅关闭
const gracefulShutdown = async (signal) => {
console.log('\n========================================')
console.log(`🛑 收到 ${signal} 信号,开始优雅关闭流程...`)
console.log(`⏰ 时间: ${new Date().toLocaleString()}`)
console.log('========================================\n')
// 设置超时计时器
const shutdownTimer = setTimeout(() => {
console.error('========================================')
console.error('❌ 关闭操作超时,强制退出')
console.error('========================================')
process.exit(1)
}, 10000)
try {
// 关闭HTTP服务器
console.log('🔐 关闭HTTP服务器...')
await new Promise((resolve) => server.close(resolve))
console.log('✅ HTTP服务器已关闭')
// 关闭Redis连接
if (redisConfig.isConnected()) {
console.log('🔐 关闭Redis连接...')
await redisConfig.disconnect()
console.log('✅ Redis连接已关闭')
}
// 关闭RabbitMQ连接
if (rabbitMQConfig.isConnected()) {
console.log('🔐 关闭RabbitMQ连接...')
await rabbitMQConfig.close()
console.log('✅ RabbitMQ连接已关闭')
}
console.log('\n========================================')
console.log('👋 服务器已完全关闭')
console.log('========================================')
clearTimeout(shutdownTimer)
process.exit(0)
} catch (error) {
console.error('========================================')
console.error('❌ 关闭过程中发生错误:', error.message)
console.error('========================================')
clearTimeout(shutdownTimer)
process.exit(1)
}
}
// 注册关闭信号
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'))
process.on('SIGINT', () => gracefulShutdown('SIGINT'))
} catch (error) {
console.error('❌ 服务器启动失败:', error)
process.exit(1)
}
}
// 如果是直接运行此文件,则启动服务器
if (require.main === module) {
console.log('\n🔧 启动模式: 直接运行')
console.log(`📌 调用堆栈: ${new Error().stack.split('\n')[1].trim()}`)
console.log('🔄 开始启动服务器...\n')
startServer()
}
module.exports = app