From d608d65bf4e135cd4f4edfe602de34b4faf524c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Mon, 6 May 2024 21:46:43 +0800 Subject: [PATCH] fix:useport try --- src/webui/src/common/config.ts | 69 ++++++++++++++++++---------------- src/webui/webui.json | 3 ++ 2 files changed, 40 insertions(+), 32 deletions(-) create mode 100644 src/webui/webui.json diff --git a/src/webui/src/common/config.ts b/src/webui/src/common/config.ts index aef3c260..cf7355bb 100644 --- a/src/webui/src/common/config.ts +++ b/src/webui/src/common/config.ts @@ -1,51 +1,56 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs"; import { resolve } from "node:path"; - const net = require('net'); -async function tryUsePort(port: number) { - function portUsed(port: number) { - return new Promise((resolve, reject) => { - let server = net.createServer().listen(port); - server.on('listening', function () { - server.close(); - resolve(port); - }); - server.on('error', function (err: any) { - if (err.code == 'EADDRINUSE') { - resolve(err); - } - }); - }); - } +// 限制尝试端口的次数,避免死循环 +const MAX_PORT_TRY = 100; - let res = await portUsed(port); - if (res instanceof Error) { - port++; - return await tryUsePort(port); - } - return port; +async function tryUsePort(port: number, tryCount: number = 0): Promise { + return new Promise((resolve, reject) => { + let server = net.createServer().listen(port); + server.on('listening', function () { + server.close(); + resolve(port); + }); + server.on('error', function (err: any) { + if (err.code === 'EADDRINUSE' && tryCount < MAX_PORT_TRY) { + resolve(tryUsePort(port + 1, tryCount + 1)); + } else if (err.code === 'EADDRINUSE' && tryCount >= MAX_PORT_TRY) { + reject("端口尝试失败"); + } else { + reject(err); + } + }); + }); } - -//读取当前目录下名为 webui.json 的配置文件 如果不存在则创建初始化配置文件 export interface WebUiConfig { port: number; } + +// 读取当前目录下名为 webui.json 的配置文件,如果不存在则创建初始化配置文件 export async function config(): Promise { try { + let configPath = resolve(__dirname, "./webui.json"); let config: WebUiConfig = { port: 6099, }; - if (!existsSync(resolve(__dirname, "./webui.json"))) { - writeFileSync(resolve(__dirname, "./webui.json"), JSON.stringify(config, null, 4)); + + if (!existsSync(configPath)) { + writeFileSync(configPath, JSON.stringify(config, null, 4)); } - config = JSON.parse(readFileSync(resolve(__dirname, "./webui.json"), "utf-8")) as WebUiConfig; - //修正端口占用情况 - config.port = await tryUsePort(config.port); - return config; + + let fileContent = readFileSync(configPath, "utf-8"); + let parsedConfig = JSON.parse(fileContent) as WebUiConfig; + + // 修正端口占用情况 + const [err, data] = await tryUsePort(parsedConfig.port).then(data => [null, data as number]).catch(err => [err, null]); + if (err) { + //一般没那么离谱 如果真有这么离谱 考虑下 向外抛出异常 + } + return parsedConfig; } catch (e) { - //console.error("读取配置文件失败", e); + console.error("读取配置文件失败", e); } - return {} as WebUiConfig; + return {} as WebUiConfig; // 理论上这行代码到不了,为了保持函数完整性而保留 } \ No newline at end of file diff --git a/src/webui/webui.json b/src/webui/webui.json new file mode 100644 index 00000000..77b151bc --- /dev/null +++ b/src/webui/webui.json @@ -0,0 +1,3 @@ +{ + "port":6099 +} \ No newline at end of file