From e9bff466b5e02450c0114aa531dd3891893b7003 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: Tue, 7 May 2024 21:24:49 +0800 Subject: [PATCH] fix:port use --- src/webui/index.ts | 2 +- src/webui/src/helper/config.ts | 46 +++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/webui/index.ts b/src/webui/index.ts index 926c3709..47613d61 100644 --- a/src/webui/index.ts +++ b/src/webui/index.ts @@ -26,7 +26,7 @@ export async function InitWebUi() { //挂载API接口 app.all('/api', APIRouter); app.listen(config.port, async () => { - console.log(`[NapCat] [WebUi] Current WebUi is running at IP:6099`); + console.log(`[NapCat] [WebUi] Current WebUi is running at IP:${config.port}`); }) } diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index 1d88e0e8..bac01bd5 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -6,21 +6,33 @@ const net = require('net'); const MAX_PORT_TRY = 100; 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); - } - }); + return new Promise(async (resolve, reject) => { + try { + let server = net.createServer(); + server.on('listening', () => { + server.close(); + resolve(port); + }); + + server.on('error', (err: any) => { + if (err.code === 'EADDRINUSE') { + if (tryCount < MAX_PORT_TRY) { + // 使用循环代替递归 + resolve(tryUsePort(port + 1, tryCount + 1)); + } else { + reject(`端口尝试失败,达到最大尝试次数: ${MAX_PORT_TRY}`); + } + } else { + reject(`遇到错误: ${err.code}`); + } + }); + + // 尝试监听端口 + server.listen(port); + } catch (error) { + // 这里捕获到的错误应该是启动服务器时的同步错误 + reject(`服务器启动时发生错误: ${error}`); + } }); } @@ -33,7 +45,7 @@ export interface WebUiConfig { // 读取当前目录下名为 webui.json 的配置文件,如果不存在则创建初始化配置文件 export async function WebUIConfig(): Promise { try { - let configPath = resolve(__dirname, "./webui.json"); + let configPath = resolve(__dirname, "./config/webui.json"); let config: WebUiConfig = { port: 6099, token: Math.random().toString(36).slice(2),//生成随机密码 @@ -49,7 +61,7 @@ export async function WebUIConfig(): Promise { // 修正端口占用情况 const [err, data] = await tryUsePort(parsedConfig.port).then(data => [null, data as number]).catch(err => [err, null]); - config.port = data; + parsedConfig.port = data; if (err) { //一般没那么离谱 如果真有这么离谱 考虑下 向外抛出异常 }