前端报错无法区分"后端已死"与"网络瞬断"——建议 /health 心跳 + 崩溃引导 #3585
Replies: 1 comment
|
方案方向完全赞成——"failed to fetch 万能背锅"是 agent 产品故障可诊断性的真实痛点,你的崩溃实录(内存 2.1GB/15.7GB + 3080 无监听 + 前端误导文案)把问题讲得很清楚。补几个源码侧事实与实现细节,让提案落得更准: 1. 关键事实修正:rc.8 源码里并没有 我全文检索了 rc.8 的
2. 错误分类器可以复用现成的
3. 心跳的触发时机建议(比纯 30s 周期更省) "任何 fetch 失败时立即探活一次 + 30s 周期兜底"方向对,但可以更省:只在 fetch 失败时探活(被动式),成功路径零开销;30s 周期只在"当前无活动但需要确认服务仍活着"的场景(如多窗口)才有价值。另外心跳本身要短超时 + 不重试(探活请求自己挂了会二次误导)。崩溃前预警(内存监控)同意 P0——崩溃是信任杀手,预警是唯一能赶在崩溃前的缓解。 4. 最小可行形态(不阻塞) 后端加免鉴权 如果官方有前端探活的既有 roadmap 位置,欢迎指路;否则这个提案从"新增免鉴权 /api/health + 被动探活"起步完全自洽。 |
Uh oh!
There was an error while loading. Please reload this page.
现象(崩溃场景实录)
DSH 网页版(http://127.0.0.1:3080)在一次多窗口并发使用中因内存耗尽崩溃(系统可用内存 2.1GB/15.7GB,崩溃时 3080 无监听、node 进程为空)。崩溃期间前端表现:
顶部出现 "自动保存失败:failed to fetch";
刷新后 3080 完全无法访问;
用户无法区分"服务已死"和"网络瞬断"——只能靠猜(重启服务、检查端口、翻日志逐个排查)。
这是发现 4(前端误导性报错)的完整背景。核心问题:failed to fetch 是浏览器层网络错误,不携带任何"后端进程是否存在"的信息——前端和后端故障在产品体验上完全同形。
建议:前端探活(/health 心跳 + 崩溃引导)
后端已有 GET /api/health(返回 {"ok": true},且免鉴权);
前端加周期性心跳(如每 30s 探测一次),并在任何 fetch 失败时立即探活一次,区分三种状态:
ECONNREFUSED / 连接失败 → "服务未运行";
超时 → "服务无响应";
其他网络错误 → "网络异常"。
探活判定"服务未运行"时,显示明确引导:"DSH 服务未运行,请重启后重试" + 一键复制重启命令(或给出重启指引链接);
避免用户在"刷新 / 重启 / 检查配置"之间盲目试错。
本机内存耗尽为崩溃确证根因(15.7GB 机器,可用跌至 2.1GB);
可在服务端监控可用内存,低于阈值(如 3GB)时主动提示"内存不足,建议关闭其他窗口/应用",而非等崩溃后用户自诊断。
把前端统一错误文案拆成:后端未运行 / 后端无响应 / 权限失败 / 网络异常 / 未知;
每类给不同的恢复指引,减少"failed to fetch 万能背锅"。
为什么值得做
崩溃/断连是 agent 产品最高频的信任杀手——用户无法自诊断时,第一反应是"产品坏了"而非"环境问题";
前端已能看到健康端点存在,成本极低(心跳 + 文案替换),收益是故障可诊断性从 0 到 1;
内存预警可复用现有系统信息(无需新增埋点)。
实测证据
崩溃事件完整回放:DSH事件说明_20260814.md(崩溃时 3080 无监听 / node 进程为空 / 内存 2.1GB/15.7GB);
前端报错原文:"自动保存失败:failed to fetch"+"暂时无法保存确认状态"。
备注
与 #3207(Windows 沙箱 schannel 失败链路)不同族——这是纯 UI/UX 层的故障可诊断性问题;
如果您认为前端探活属于某个现有 roadmap 项,请指路,我们可补测试数据。
All reactions