const express = require("express"); const { createProxyMiddleware } = require("http-proxy-middleware"); const path = require("path"); const app = express(); const PORT = process.env.PORT; const BACKEND_URL = process.env.BACKEND_URL || "http://localhost:8000"; // 健康检查 app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }); }); // API代理 - 需要在body parser之前 app.use("/api", createProxyMiddleware({ target: BACKEND_URL, changeOrigin: true, timeout: 30000, proxyTimeout: 30000 })); // 上传文件代理 app.use("/uploads", createProxyMiddleware({ target: BACKEND_URL, changeOrigin: true, timeout: 30000, proxyTimeout: 30000 })); // 设置请求体大小限制 - 放在代理之后 app.use(express.json({ limit: '50mb' })); app.use(express.urlencoded({ limit: '50mb', extended: true })); // 静态文件服务 app.use(express.static(path.join(__dirname, "dist"), { maxAge: '1d', etag: true })); // SPA路由处理 - 必须放在最后 app.get("*", (req, res) => { res.sendFile(path.join(__dirname, "dist", "index.html")); }); // 错误处理中间件 app.use((err, req, res, next) => { console.error('Server error:', err); res.status(500).json({ error: 'Internal server error' }); }); app.listen(PORT, '0.0.0.0', () => { console.log(`iMeeting Frontend Server running on port ${PORT}`); console.log(`Backend proxy target: ${BACKEND_URL}`); console.log(`Environment: ${process.env.NODE_ENV}`); });