/** * 宝塔面板简化启动脚本 - 兼容Node.js v16 * 专门用于后端服务启动 */ const { spawn } = require('child_process'); const path = require('path'); const fs = require('fs'); // 设置环境变量 process.env.PORT = process.env.PORT || 4001; process.env.NODE_ENV = 'production'; console.log('=== 宝塔面板简化启动脚本 ==='); console.log(`端口: ${process.env.PORT}`); console.log(`环境: ${process.env.NODE_ENV}`); console.log(`工作目录: ${process.cwd()}`); console.log(`Node.js版本: ${process.version}`); // 检查关键文件 const requiredFiles = [ 'api/server.ts', 'api/app.ts', 'package.json' ]; for (const file of requiredFiles) { if (!fs.existsSync(file)) { console.error(`错误: 缺少必要文件 ${file}`); process.exit(1); } } console.log('✓ 必要文件检查通过'); // 首先尝试编译TypeScript文件(仅后端) console.log('正在编译后端TypeScript文件...'); const tscProcess = spawn('npx', ['tsc', '--project', 'tsconfig.server.json'], { cwd: process.cwd(), stdio: 'inherit' }); tscProcess.on('exit', (code) => { if (code === 0) { console.log('✓ 后端TypeScript编译成功'); startCompiledServer(); } else { console.log('后端TypeScript编译失败,尝试直接启动...'); startWithTsNode(); } }); tscProcess.on('error', (err) => { console.log('TypeScript编译器不可用,尝试直接启动...'); startWithTsNode(); }); function startCompiledServer() { console.log('使用编译后的JS文件启动服务器...'); const server = spawn('node', ['dist/api/server.js'], { cwd: process.cwd(), stdio: 'inherit', env: { ...process.env, PORT: process.env.PORT || 4001, NODE_ENV: 'production' } }); setupServerHandlers(server); } function startWithTsNode() { console.log('使用ts-node启动服务器...'); // 使用ts-node,指定服务器专用配置 const server = spawn('npx', ['ts-node', '--project', 'tsconfig.server.json', '--esm', 'api/server.ts'], { cwd: process.cwd(), stdio: 'inherit', env: { ...process.env, PORT: process.env.PORT || 4001, NODE_ENV: 'production' } }); server.on('error', (err) => { console.log('ts-node启动失败,尝试使用tsx...'); startWithTsx(); }); server.on('exit', (code) => { if (code !== 0) { console.log('ts-node启动失败,尝试使用tsx...'); startWithTsx(); } }); setupServerHandlers(server); } function startWithTsx() { console.log('使用tsx启动服务器...'); const server = spawn('npx', ['tsx', 'api/server.ts'], { cwd: process.cwd(), stdio: 'inherit', env: { ...process.env, PORT: process.env.PORT || 4001, NODE_ENV: 'production' } }); server.on('error', (err) => { console.error('所有启动方式都失败了:', err); process.exit(1); }); setupServerHandlers(server); } function setupServerHandlers(server) { server.on('error', (err) => { console.error('服务器启动失败:', err); process.exit(1); }); server.on('exit', (code, signal) => { console.log(`服务器进程退出,代码: ${code}, 信号: ${signal}`); if (code !== 0) { console.error('服务器异常退出'); process.exit(1); } }); // 处理进程退出信号 process.on('SIGTERM', () => { console.log('收到SIGTERM信号,正在关闭服务...'); if (server) { server.kill('SIGTERM'); } setTimeout(() => { process.exit(0); }, 5000); }); process.on('SIGINT', () => { console.log('收到SIGINT信号,正在关闭服务...'); if (server) { server.kill('SIGINT'); } setTimeout(() => { process.exit(0); }, 5000); }); } // 防止进程意外退出 process.on('uncaughtException', (err) => { console.error('未捕获的异常:', err); }); process.on('unhandledRejection', (reason, promise) => { console.error('未处理的Promise拒绝:', reason); }); console.log('✓ 启动脚本初始化完成');