现象
在控制台删除被引用记录时,引用完整性 hook 抛出的业务错误在报错 toast 里显示成:
[ObjectStack] hook 'pm_ref_base' threw: Error: 制作基地被「项目主计划批次」引用(3 条),删除被阻断,请先解除引用
最终用户不关心错误来自哪个 ObjectStack hook——throw new Error('…') 是 hook 作者刻意表达的业务规则,toast 应该只显示:
制作基地被「项目主计划批次」引用(3 条),删除被阻断,请先解除引用
根因(三层拼接)
- QuickJS 沙箱把 hook 抛错包装成
hook 'x' threw: Error: …(SandboxError.message,本意是服务端日志用),原始业务消息保留在 .innerMessage;
- REST 数据路由的
mapDataError 没有解包 innerMessage(自定义 action 路由 http-dispatcher 里早就解包了,数据 CRUD 路径漏了);
- 客户端 SDK
_fetch 又拼了 [ObjectStack] CODE: 前缀。
修复要求
- toast 只显示业务消息本身;
- 完整调试包装(hook 名 + 堆栈)仍要写服务端日志,排障不受影响;
TypeError: 等非默认错误名保留(真实脚本 bug 的信号,区别于业务规则);
- 兼容旧版打包 client(不能返回会被旧 client 拼进消息的
code 字段)。
待办
现象
在控制台删除被引用记录时,引用完整性 hook 抛出的业务错误在报错 toast 里显示成:
最终用户不关心错误来自哪个 ObjectStack hook——
throw new Error('…')是 hook 作者刻意表达的业务规则,toast 应该只显示:根因(三层拼接)
hook 'x' threw: Error: …(SandboxError.message,本意是服务端日志用),原始业务消息保留在.innerMessage;mapDataError没有解包innerMessage(自定义 action 路由 http-dispatcher 里早就解包了,数据 CRUD 路径漏了);_fetch又拼了[ObjectStack] CODE:前缀。修复要求
TypeError:等非默认错误名保留(真实脚本 bug 的信号,区别于业务规则);code字段)。待办
mapDataError解包 innerMessage + 正则兜底[ObjectStack] CODE:前缀