Skip to content

callData 的 ObjectQL 兜底路径对「记录不存在」给三种不同答案(get→200 null / update→500 / delete→200 deleted:true) #5138

Description

@os-zhuang

观察类(finding):该分支在装了 MetadataPlugin(@objectstack/metadata-protocol,它注册 protocol 槽)的部署上不会跑到 —— callData 每个操作都优先走 protocol。所以今天没有用户撞得到,记录在案交分诊定级,不自行判轻重。

事实(packages/runtime/src/action-execution.ts,#5092 阅读期间发现)

callData 每个操作都是「protocol 优先,ObjectQL 兜底」。兜底分支对同一个事实(id 指向的记录不存在)给出三种互不一致的答案:

  • get(action-execution.ts get 分支):findmatch ? {...} : null → 返回 null,/data 包成 200 {data: null};
  • update:if (!existing) throw new Error('[ObjectStack] Not Found') —— 这个 Error 不带 .status / .statusCode,两个 dispatcher 错误出口因此都兜底到 500。一个「记录不存在」被报成内部错误;
  • delete:没有存在性检查,直接 ql.delete(...) 然后返回 { deleted: true }200,对一条从未存在过的记录也回「删掉了」。

三者本应是同一个答案(大概率 404),而 protocol 路径给的是什么、与兜底是否一致,也没有任何测试钉住 —— 两条路径对同一请求可能给不同状态码,而调用方(/data、MCP 桥、以及即将接线的声明式端点执行器)无从分辨自己走的是哪条。

为什么值得记

不在本单处置的原因

#5092 的范围是端点目标委派,action-execution.ts 不在其文件面内;且此处要决定的是「记录不存在的规范答案是什么」,应有一次明确取舍(建议:三者统一成带 .status = 404 的抛出,protocol 路径同题对齐并补测试),不适合顺手改。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions