// ABOUTME: Express server with Vite integration // ABOUTME: Handles API routes and serves frontend in dev/prod modes import { createServer, type Server } from 'http'; import express from 'express'; import router from './routes/index'; import { setupVite } from './vite'; const isDev = process.env.COZE_PROJECT_ENV !== 'PROD'; const port = parseInt(process.env.PORT || '<%= port %>', 10); const hostname = process.env.HOSTNAME || 'localhost'; const app = express(); // 使用 http.createServer 包装 Express app,以便支持 WebSocket 等协议升级 const server = createServer(app); async function startServer(): Promise { // 请求日志(仅开发环境) if (isDev) { app.use((req, res, next) => { const start = Date.now(); res.on('finish', () => { const ms = Date.now() - start; console.log(`${req.method} ${req.url} - ${ms}ms`); }); next(); }); } // 添加请求体解析 app.use(express.json()); app.use(express.urlencoded({ extended: true })); // 注册 API 路由 app.use(router); // 集成 Vite(开发模式)或静态文件服务(生产模式) await setupVite(app); // 全局错误处理 app.use((err: Error, req: express.Request, res: express.Response) => { console.error('Server error:', err); const status = 'status' in err ? (err as { status?: number }).status ?? 500 : 500; res.status(status).json({ error: err.message || 'Internal server error', }); }); server.once('error', err => { console.error('Server error:', err); process.exit(1); }); server.listen(port, () => { console.log(`\n✨ Server running at http://${hostname}:${port}`); console.log(`📝 Environment: ${isDev ? 'development' : 'production'}\n`); }); return server; } startServer().catch(err => { console.error('Failed to start server:', err); process.exit(1); });