Files
ai-xiaocai/server/server.js
2026-07-22 18:07:12 +08:00

62 lines
1.9 KiB
JavaScript

// 入口文件 — 组装所有模块
const express = require('express');
const http = require('http');
const { WebSocketServer } = require('ws');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const { v4: uuidv4 } = require('uuid');
const db = require('./db');
const wsModule = require('./ws');
const { authMiddleware } = require('./middleware/auth');
const app = express();
const server = http.createServer(app);
const wss = new WebSocketServer({ server });
// 中间件
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));
// 上传目录
const uploadsDir = path.join(__dirname, 'data', 'uploads');
if (!fs.existsSync(uploadsDir)) fs.mkdirSync(uploadsDir, { recursive: true });
app.use('/uploads', express.static(uploadsDir));
// Multer 配置
const storage = multer.diskStorage({
destination: uploadsDir,
filename: (req, file, cb) => {
const ext = path.extname(file.originalname);
const safeName = uuidv4().replace(/-/g, '').substring(0, 12);
cb(null, safeName + ext);
}
});
const upload = multer({
storage,
limits: { fileSize: 10 * 1024 * 1024 },
fileFilter: (req, file, cb) => {
const allowed = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
cb(null, allowed.includes(file.mimetype));
}
});
// 路由
app.use('/api', require('./routes/auth'));
app.use('/api/rooms', require('./routes/rooms'));
app.use('/api/rooms', require('./routes/messages'));
app.use('/api', require('./routes/purchases'));
// 上传
app.post('/api/upload', authMiddleware, upload.single('file'), (req, res) => {
if (!req.file) return res.status(400).json({ error: '请上传图片' });
res.json({ path: '/uploads/' + req.file.filename });
});
// WebSocket
wsModule.init(wss);
// 启动
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => console.log(`Server running on port ${PORT}`));