fix:port use

This commit is contained in:
手瓜一十雪 2024-05-07 21:24:49 +08:00
parent 5d77f50160
commit e9bff466b5
2 changed files with 30 additions and 18 deletions

View File

@ -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}`);
})
}

View File

@ -6,21 +6,33 @@ const net = require('net');
const MAX_PORT_TRY = 100;
async function tryUsePort(port: number, tryCount: number = 0): Promise<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' && 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<WebUiConfig> {
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<WebUiConfig> {
// 修正端口占用情况
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) {
//一般没那么离谱 如果真有这么离谱 考虑下 向外抛出异常
}