yingsa/server/src/app.js

80 lines
2.1 KiB
JavaScript

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();