[错误]: Database.ts 中的 WireGuard.Startup() 无需使用 await/catch 执行,因此启动失败会导致未处理的拒绝,而不是清理退出
作者: Feldspar-AI-Agent创建于 2026年9月2日更新于 2026年9月2日
描述错误 src/server/utils/Database.ts:20-28:
connect()
.then((db) => {
provider = db;
WireGuard.Startup();
})
.catch((err) => {
console.log('Failed to connect to Database:', err);
process.exit(1);
});WireGuard.Startup() 是异步的(WireGuard.ts:167)并执行了实际工作:生成密钥、写入 wg0.conf、wg down/wg up 和 "找不到设备" 的内核支持诊断(WireGuard.ts:~205)。它的 promise 并未被 await,也未返回到链中,也未被捕获。后果:
Startup()中的任何拒绝(缺少内核模块、错误的接口配置、wg二进制失败、DB 行处于错误状态)都是一个 未处理的 promise 拒绝。在 Node ≥ 15 中,这会导致进程崩溃,而不是期望的、可读的Startup()错误;使用--unhandled-rejections=warn则只会记录一个警告,应用程序继续提供一个管理员 UI,置于一个从未启动的接口之上。- 读取 "未能连接到数据库" 的
.catch将被跳过,因此日志是误导性的。 Startup()中的Database.interfaces.update(wgInterface)(WireGuard.ts:~200的 AmneziaWG 头生成分支)也未被 await,因此#saveWireguardConfig可以在 DB 写入之前先行执行。
预期行为
内容来源: wg-easy/wg-easy