fix:useport try

This commit is contained in:
手瓜一十雪 2024-05-06 21:46:43 +08:00
parent c0f2df172a
commit d608d65bf4
2 changed files with 40 additions and 32 deletions

View File

@ -1,51 +1,56 @@
import { existsSync, readFileSync, writeFileSync } from "node:fs"; import { existsSync, readFileSync, writeFileSync } from "node:fs";
import { resolve } from "node:path"; import { resolve } from "node:path";
const net = require('net'); const net = require('net');
async function tryUsePort(port: number) { // 限制尝试端口的次数,避免死循环
function portUsed(port: number) { const MAX_PORT_TRY = 100;
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);
}
});
});
}
let res = await portUsed(port); async function tryUsePort(port: number, tryCount: number = 0): Promise<number> {
if (res instanceof Error) { return new Promise((resolve, reject) => {
port++; let server = net.createServer().listen(port);
return await tryUsePort(port); server.on('listening', function () {
} server.close();
return port; 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 { export interface WebUiConfig {
port: number; port: number;
} }
// 读取当前目录下名为 webui.json 的配置文件,如果不存在则创建初始化配置文件
export async function config(): Promise<WebUiConfig> { export async function config(): Promise<WebUiConfig> {
try { try {
let configPath = resolve(__dirname, "./webui.json");
let config: WebUiConfig = { let config: WebUiConfig = {
port: 6099, 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;
//修正端口占用情况 let fileContent = readFileSync(configPath, "utf-8");
config.port = await tryUsePort(config.port); let parsedConfig = JSON.parse(fileContent) as WebUiConfig;
return config;
// 修正端口占用情况
const [err, data] = await tryUsePort(parsedConfig.port).then(data => [null, data as number]).catch(err => [err, null]);
if (err) {
//一般没那么离谱 如果真有这么离谱 考虑下 向外抛出异常
}
return parsedConfig;
} catch (e) { } catch (e) {
//console.error("读取配置文件失败", e); console.error("读取配置文件失败", e);
} }
return {} as WebUiConfig; return {} as WebUiConfig; // 理论上这行代码到不了,为了保持函数完整性而保留
} }

3
src/webui/webui.json Normal file
View File

@ -0,0 +1,3 @@
{
"port":6099
}