66 lines
1.6 KiB
JavaScript
66 lines
1.6 KiB
JavaScript
const express = require('express')
|
|
const path = require('path')
|
|
const net = require('net')
|
|
|
|
const appHttp = express()
|
|
const START_PORT = 9527
|
|
const MAX_PORT = 9999
|
|
|
|
// 检查端口是否可用
|
|
function isPortAvailable(port) {
|
|
return new Promise((resolve) => {
|
|
const server = net.createServer()
|
|
server.listen(port, '127.0.0.1', () => {
|
|
server.once('close', () => resolve(true))
|
|
server.close()
|
|
})
|
|
server.on('error', () => resolve(false))
|
|
})
|
|
}
|
|
|
|
// 寻找可用端口
|
|
async function findAvailablePort(startPort, maxPort) {
|
|
for (let port = startPort; port <= maxPort; port++) {
|
|
const available = await isPortAvailable(port)
|
|
if (available) {
|
|
return port
|
|
}
|
|
}
|
|
throw new Error(`No available port found between ${startPort} and ${maxPort}`)
|
|
}
|
|
|
|
// 获取 dist 目录路径
|
|
let distPath
|
|
if (process.env.NODE_ENV === 'development') {
|
|
// 开发环境
|
|
distPath = path.join(__dirname, '..', 'dist')
|
|
} else {
|
|
// 生产环境(打包后)
|
|
distPath = path.join(__dirname, 'dist')
|
|
}
|
|
|
|
console.log('Serving static files from:', distPath)
|
|
|
|
// 提供静态文件
|
|
appHttp.use(express.static(distPath))
|
|
|
|
// 启动服务器
|
|
async function startServer() {
|
|
try {
|
|
const PORT = await findAvailablePort(START_PORT, MAX_PORT)
|
|
|
|
const server = appHttp.listen(PORT, '127.0.0.1', () => {
|
|
console.log(`✅ Local server running at http://127.0.0.1:${PORT}`)
|
|
})
|
|
|
|
// 导出服务器实例和端口,以便在需要时关闭
|
|
return { server, PORT }
|
|
} catch (error) {
|
|
console.error('❌ Failed to start server:', error.message)
|
|
throw error
|
|
}
|
|
}
|
|
|
|
// 导出启动函数
|
|
module.exports = { startServer }
|