Skip to content

fix: 报错统一改为简短中文 - #63

Merged
stqfdyr merged 2 commits into
mainfrom
fix/error-messages
Sep 24, 2026
Merged

stqfdyr merged 2 commits into
mainfrom
fix/error-messages

Conversation

@stqfdyr

@stqfdyr stqfdyr commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

hub

  • 错误回复只有两个出口:api::answer / bad 返回写好的文案;其余错误交给 api::fail。错误链上有 Shown(refuse! 或 .context(Shown(..)))就回 400 带那句话,没有就把整条链记 warn,回 500「hub 内部出错,详细原因见 hub 日志」
  • 中间件 api::plain_errors 兜住 hub 没有自己写文案的错误回复(axum 的 JSON / 路径 / 参数拒绝、请求体上限 413、空的 401 / 404),按状态码换成中文,只换正文,原响应头保留(如 405 的 Allow)
  • install.sh 与 agent 用的四条路由(/api/agent/ws、/api/agent/register、/install.sh、/agent/{arch})合并在中间件之后,回给它们的报错保持英文,与脚本和 agent 自己的输出一致
  • 英文校验提示全部改成中文:节点、分组、国家与地址、流量、探测任务、设置、通知渠道、备份校验、密码登录
  • 主题包:读到一半中断(截断、不是 gzip)提示「主题包损坏或不完整(可能没下载完),重新下载 theme.tar.gz 再试」;同名的文件与目录、过长的文件名提示包本身有问题;写盘失败仍按内部错误处理。不再显示服务器路径与解压库原文
  • 主题更新:读不到 release 时区分「还没有正式 release」「被 GitHub 限流」「回复无法识别」「连不上 api.github.com」;下载失败提示检查网络或 GitHub 代理
  • 通知测试:失败原因按渠道与状态码写成中文(如「Telegram:Chat ID 不对,或者 bot 还没有加入这个会话(HTTP 400)」),对方的原始回复进日志(not delivered);渠道名显示为 Telegram / Webhook;数值设置的名称写进 NUMBERS 表
  • GitHub 登录:登录页显示中文原因,区分连不上、回复无法识别、没有返回用户信息(带状态码);GitHub 的原始回复只进日志。URL 里的错误码不原样显示
  • 探测任务只在外键失败时说「节点不存在」;删除已不存在的主题回「没有这个主题」;排序与探测任务保存遇到数据库错误回 500,不再当成 400 把 SQLite 原文带出去
  • 上传中途断开提示「上传中断了,请重新上传」,只记 info

面板

  • api() / upload():只把 text/plain 的错误回复当 hub 的话;反代或 CDN 的 HTML 错误页、不带 Content-Type 的回复按状态码说明,断网提示「连不上 hub」,200 却不是 JSON 提示检查 /api 的转发

测试

  • cargo fmt --check、cargo clippy --all-targets、cargo test(126 个)、scripts/e2e.sh;tsc -b、oxlint、npm test 通过
  • 新增:错误回复只带写好的文案(库错误、axum 拒绝文案不外泄);截断一半的主题包给出「主题包损坏或不完整」;每种坏包都带中文原因而不是 500(含同名文件与目录);备份校验的每种拒绝都带中文原因;给已删除的节点保存探测任务得到「节点不存在」
  • 临时 hub 实测:截图里那个截断的 Glassmorphism 1.0.2 包、非 gzip 文件、同名文件与目录的包都回中文提示,日志保留原文;Glassmorphism 1.0.0–1.0.2、默认主题 1.1.0、serverstatus 1.2.0 照常安装;面板路由的 axum 拒绝、请求体超限、未登录、未知接口都是中文,405 保留 Allow;注册接口与 agent 握手的 axum 拒绝保持英文
  • 浏览器实测面板主题页:截断包、反代 HTML 502、CDN 403、代理返回 200 网页、断网,五种情况的提示都正确
  • Traefik v3 实测:后端不可达时回 502 Bad Gateway、不带 Content-Type,面板按状态码说明

- hub 的错误回复只有两个出口:写好的中文文案原样返回;其余错误记进日志,
  面板只显示「hub 内部出错,详细原因见 hub 日志」。axum 自带的拒绝文案由
  中间件换成按状态码的中文说明。
- 英文校验提示全部改成中文;回给 install.sh 与 agent 的保持英文。
- 主题包读到一半中断(截断、不是 gzip)提示重新下载,不再显示解压库原文与
  服务器路径。
- 通知测试、GitHub 登录、主题更新:第三方的回复按状态码写成中文原因,原文进日志。
- 面板:反代或 CDN 的错误页、断网、200 却不是 JSON,都按状态给中文说明。
@stqfdyr stqfdyr changed the title fix: 报错统一为简短中文,原始错误只进日志;主题包校验 gzip 校验和 fix: 报错统一改为简短中文 Sep 24, 2026
- install.sh 与 agent 用的四条路由合并在改写中间件之后,axum 的拒绝保持英文;
  中间件只换正文,保留原响应头(如 405 的 Allow)。
- GitHub 登录与主题更新:GitHub 回了但内容读不懂时不再说成「连不上」;
  /user 返回非用户信息时带上状态码。
- 主题包里同名的文件与目录、过长的文件名给出包的问题,不再是内部错误。
- 探测任务只在外键失败时说「节点不存在」,其余数据库错误按内部错误处理。
- 上传中途断开提示重新上传,只记 info。
- 通知数值设置的名称写进 NUMBERS 表。
@stqfdyr
stqfdyr merged commit eedbc95 into main Sep 24, 2026
1 check passed
@stqfdyr
stqfdyr deleted the fix/error-messages branch September 24, 2026 19:18
stqfdyr added a commit to monitor-probe/monitor-theme-default that referenced this pull request Sep 24, 2026
- `api()`:只把 `text/plain` 的错误回复当 hub 的话原样显示;反代或 CDN 的错误页(如 nginx 的 502、Cloudflare 的拦截页)不再把 HTML 显示给访客,按状态码说明「服务暂时无法访问」或「请求被拦截」
- 断网提示「网络连接失败,稍后再试」;返回 200 却不是 JSON 提示「收到的不是状态数据」
- 错误信息不再可能是空串,去掉 `App.tsx`、`NodeDetail.tsx` 两处 `|| "网络错误"` 兜底

配合 monitor-probe/monitor#63:hub 的错误回复改为一行中文纯文本。

## 测试

- `tsc -b`、`oxlint`、`npm test` 通过
- 打包装进临时 hub 后浏览器实测:`/api/me` 返回 HTML 502、断网、200 网页三种情况,首页都显示中文提示与重试按钮
stqfdyr added a commit to monitor-probe/monitor-theme-serverstatus that referenced this pull request Sep 24, 2026
- `api()`:只把 `text/plain` 的错误回复当 hub 的话原样显示;反代或 CDN 的错误页(如 nginx 的 502、Cloudflare 的拦截页)不再把 HTML 显示给访客,按状态码说明「服务暂时无法访问」或「请求被拦截」
- 断网提示「网络连接失败,稍后再试」;返回 200 却不是 JSON 提示「收到的不是状态数据」
- 错误信息不再可能是空串,去掉 `App.tsx`、`NodeDetail.tsx` 两处 `|| "网络错误"` 兜底

配合 monitor-probe/monitor#63:hub 的错误回复改为一行中文纯文本。

## 测试

- `tsc -b`、`oxlint`、`npm test` 通过
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant