|
|
const express = require('express');
|
|
|
const { createProxyMiddleware } = require('http-proxy-middleware');
|
|
|
const { spawn } = require('child_process');
|
|
|
|
|
|
const proxyPort = 3000;
|
|
|
const nextPort = 3001;
|
|
|
const goBackendPort = 9999;
|
|
|
|
|
|
// 启动 Next.js 开发服务器
|
|
|
function startNextServer() {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
console.log(`Starting Next.js server on port ${nextPort}...`);
|
|
|
|
|
|
const nextProcess = spawn('npx', ['next', 'dev', '-p', nextPort.toString()], {
|
|
|
stdio: 'pipe',
|
|
|
env: { ...process.env }
|
|
|
});
|
|
|
|
|
|
nextProcess.stdout.on('data', (data) => {
|
|
|
const output = data.toString();
|
|
|
console.log(`[Next.js] ${output.trim()}`);
|
|
|
|
|
|
// 检测 Next.js 是否已经启动完成
|
|
|
if (output.includes('Ready') || output.includes('started server')) {
|
|
|
resolve(nextProcess);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
nextProcess.stderr.on('data', (data) => {
|
|
|
console.error(`[Next.js Error] ${data.toString().trim()}`);
|
|
|
});
|
|
|
|
|
|
nextProcess.on('error', (error) => {
|
|
|
console.error('Failed to start Next.js server:', error);
|
|
|
reject(error);
|
|
|
});
|
|
|
|
|
|
// 设置超时
|
|
|
setTimeout(() => {
|
|
|
resolve(nextProcess);
|
|
|
}, 10000);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// 启动 Express 代理服务器
|
|
|
async function startProxyServer() {
|
|
|
console.log(`Starting Express proxy server on port ${proxyPort}...`);
|
|
|
|
|
|
const app = express();
|
|
|
|
|
|
// Socket.io 代理到 Go 后端
|
|
|
const socketProxy = createProxyMiddleware('/socket.io', {
|
|
|
target: `http://localhost:${goBackendPort}`,
|
|
|
ws: true,
|
|
|
changeOrigin: true,
|
|
|
logLevel: 'debug'
|
|
|
});
|
|
|
|
|
|
// Next.js 代理
|
|
|
const nextProxy = createProxyMiddleware({
|
|
|
target: `http://localhost:${nextPort}`,
|
|
|
changeOrigin: true,
|
|
|
ws: true, // 支持 WebSocket(用于热重载)
|
|
|
logLevel: 'silent'
|
|
|
});
|
|
|
|
|
|
// 添加代理中间件
|
|
|
app.use('/socket.io', socketProxy);
|
|
|
app.use('/', nextProxy);
|
|
|
|
|
|
// app.on('upgrade', (req, socket, head) => {
|
|
|
// console.log('WebSocket upgrade request received');
|
|
|
// socketProxy(req, socket, head);
|
|
|
// });
|
|
|
|
|
|
app.listen(proxyPort, () => {
|
|
|
console.log(`🚀 Proxy server ready on http://localhost:${proxyPort}`);
|
|
|
console.log(`📡 Proxying Socket.io to http://localhost:${goBackendPort}`);
|
|
|
console.log(`⚛️ Proxying Next.js from http://localhost:${nextPort}`);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// 主启动函数
|
|
|
async function start() {
|
|
|
try {
|
|
|
// 先启动 Next.js 服务器
|
|
|
const nextProcess = await startNextServer();
|
|
|
|
|
|
// 等待一下确保 Next.js 完全启动
|
|
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
|
|
|
|
// 然后启动代理服务器
|
|
|
await startProxyServer();
|
|
|
|
|
|
// 优雅关闭处理
|
|
|
process.on('SIGINT', () => {
|
|
|
console.log('\n🛑 Shutting down servers...');
|
|
|
nextProcess.kill('SIGTERM');
|
|
|
process.exit(0);
|
|
|
});
|
|
|
|
|
|
process.on('SIGTERM', () => {
|
|
|
console.log('\n🛑 Shutting down servers...');
|
|
|
nextProcess.kill('SIGTERM');
|
|
|
process.exit(0);
|
|
|
});
|
|
|
|
|
|
} catch (error) {
|
|
|
console.error('Failed to start servers:', error);
|
|
|
process.exit(1);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
start(); |