const express = require('express'); const cors = require('cors'); const http = require('http'); require('dotenv').config(); const sequelize = require('./config/database'); const { initWebSocket } = require('./websocket'); // 路由 const userRoutes = require('./routes/user'); const storeRoutes = require('./routes/store'); const ladderRoutes = require('./routes/ladder'); const matchRoutes = require('./routes/match'); const pointsRoutes = require('./routes/points'); const adminRoutes = require('./routes/admin'); const uploadRoutes = require('./routes/upload'); const app = express(); const server = http.createServer(app); // 中间件 app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use('/uploads', express.static('uploads')); // API路由 app.use('/api/user', userRoutes); app.use('/api/store', storeRoutes); app.use('/api/ladder', ladderRoutes); app.use('/api/match', matchRoutes); app.use('/api/points', pointsRoutes); app.use('/api/admin', adminRoutes); app.use('/api/upload', uploadRoutes); // 健康检查 app.get('/health', (req, res) => { res.json({ status: 'ok', time: new Date().toISOString() }); }); // 错误处理 app.use((err, req, res, next) => { console.error('Error:', err); res.status(err.status || 500).json({ code: err.code || 500, message: err.message || '服务器内部错误' }); }); // 初始化WebSocket initWebSocket(server); // 启动服务 const PORT = process.env.PORT || 3000; async function startServer() { try { // 测试数据库连接 await sequelize.authenticate(); console.log('数据库连接成功'); // 同步模型(开发环境) // 注意:如果遇到 ER_TOO_MANY_KEYS 错误,需要手动清理数据库中多余的索引 if (process.env.NODE_ENV === 'development') { // 使用 alter: false 避免索引过多的问题 await sequelize.sync({ alter: false }); console.log('数据库模型同步完成'); } server.listen(PORT, () => { console.log(`服务器运行在 http://localhost:${PORT}`); }); } catch (error) { console.error('启动失败:', error); process.exit(1); } } startServer();