const express = require('express'); const dotenv = require('dotenv'); const cors = require('cors'); const morgan = require('morgan'); const { connectDB } = require('./config/db'); const { errorHandler } = require('./middleware/errorHandler'); const routes = require('./routes'); const logger = require('./utils/logger'); // 加载环境变量 dotenv.config(); // 验证关键环境变量 const requiredEnvVars = ['MONGODB_URI', 'JWT_SECRET', 'ADMIN_USERNAME', 'ADMIN_PASSWORD']; const missingEnvVars = requiredEnvVars.filter(envVar => !process.env[envVar]); if (missingEnvVars.length > 0) { logger.error(`缺少必要的环境变量: ${missingEnvVars.join(', ')}`); process.exit(1); } logger.info('环境变量加载成功'); logger.info(`NODE_ENV: ${process.env.NODE_ENV}`); logger.info(`ADMIN_USERNAME: ${process.env.ADMIN_USERNAME}`); logger.info(`JWT_SECRET: ${process.env.JWT_SECRET ? '已设置' : '未设置'}`); // 初始化 Express 应用 const app = express(); // 中间件 app.use(cors()); app.use(express.json({ limit: '50mb' })); app.use(express.urlencoded({ extended: true, limit: '50mb' })); // 日志中间件 if (process.env.NODE_ENV === 'development') { app.use(morgan('dev')); } // 连接数据库 connectDB(); // 路由 app.use('/api', routes); // 健康检查端点 app.get('/health', (req, res) => { res.status(200).json({ status: 'ok', message: 'Server is running' }); }); // 错误处理中间件 app.use(errorHandler); // 启动服务器 const PORT = process.env.PORT || 8080; app.listen(PORT, () => { logger.info(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`); }); // 处理未捕获的异常 process.on('uncaughtException', (err) => { logger.error('Uncaught Exception:', err); process.exit(1); }); // 处理未处理的 Promise 拒绝 process.on('unhandledRejection', (err) => { logger.error('Unhandled Rejection:', err); process.exit(1); });