mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2024-11-21 09:36:35 +00:00
fix:useport try
This commit is contained in:
parent
c0f2df172a
commit
d608d65bf4
@ -1,10 +1,11 @@
|
|||||||
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;
|
||||||
|
|
||||||
|
async function tryUsePort(port: number, tryCount: number = 0): Promise<number> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let server = net.createServer().listen(port);
|
let server = net.createServer().listen(port);
|
||||||
server.on('listening', function () {
|
server.on('listening', function () {
|
||||||
@ -12,40 +13,44 @@ async function tryUsePort(port: number) {
|
|||||||
resolve(port);
|
resolve(port);
|
||||||
});
|
});
|
||||||
server.on('error', function (err: any) {
|
server.on('error', function (err: any) {
|
||||||
if (err.code == 'EADDRINUSE') {
|
if (err.code === 'EADDRINUSE' && tryCount < MAX_PORT_TRY) {
|
||||||
resolve(err);
|
resolve(tryUsePort(port + 1, tryCount + 1));
|
||||||
|
} else if (err.code === 'EADDRINUSE' && tryCount >= MAX_PORT_TRY) {
|
||||||
|
reject("端口尝试失败");
|
||||||
|
} else {
|
||||||
|
reject(err);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
let res = await portUsed(port);
|
|
||||||
if (res instanceof Error) {
|
|
||||||
port++;
|
|
||||||
return await tryUsePort(port);
|
|
||||||
}
|
|
||||||
return port;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//读取当前目录下名为 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
3
src/webui/webui.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"port":6099
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user