yingsa/server/src/app.js
Ethanfly d07ebb735a fix(env): Update API URL and enhance HTML structure
- Change VITE_API_URL in .env from localhost:3000 to localhost:3001 for backend access.
- Update index.html to replace favicon with logo.png and ensure proper HTML structure.
- Add new dependencies for WangEditor in package.json and package-lock.json to support rich text editing features.
2026-02-06 19:04:16 +08:00

86 lines
2.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 articleRoutes = require('./routes/article');
const pointsRoutes = require('./routes/points');
const adminRoutes = require('./routes/admin');
const uploadRoutes = require('./routes/upload');
const app = express();
const server = http.createServer(app);
// 信任代理(支持反向代理的 HTTPS
// 如果应用部署在 nginx 等反向代理后面,需要设置此项
app.set('trust proxy', true);
// 中间件
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.use('/api/article', articleRoutes);
// 健康检查
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();