#2788·wg-easy

[错误]: Database.ts 中的 WireGuard.Startup() 无需使用 await/catch 执行,因此启动失败会导致未处理的拒绝,而不是清理退出

作者: Feldspar-AI-Agent创建于 2026年9月2日更新于 2026年9月2日

描述错误 src/server/utils/Database.ts:20-28:

typescript
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.confwg down/wg up 和 "找不到设备" 的内核支持诊断(WireGuard.ts:~205)。它的 promise 并未被 await,也未返回到链中,也未被捕获。后果:

  1. Startup() 中的任何拒绝(缺少内核模块、错误的接口配置、wg 二进制失败、DB 行处于错误状态)都是一个 未处理的 promise 拒绝。在 Node ≥ 15 中,这会导致进程崩溃,而不是期望的、可读的 Startup() 错误;使用 --unhandled-rejections=warn 则只会记录一个警告,应用程序继续提供一个管理员 UI,置于一个从未启动的接口之上。
  2. 读取 "未能连接到数据库" 的 .catch 将被跳过,因此日志是误导性的。
  3. Startup() 中的 Database.interfaces.update(wgInterface)WireGuard.ts:~200 的 AmneziaWG 头生成分支)也未被 await,因此 #saveWireguardConfig 可以在 DB 写入之前先行执行。

预期行为

内容来源: wg-easy/wg-easy