2.6 KiB
2.6 KiB
大鱼作品列表 items_json 兼容修复 2026-04-28
背景
大鱼吃小鱼作品列表在 server-rs 链路里由 SpacetimeDB procedure 返回 items_json,再由 spacetime-client 反序列化成 BigFishWorkSummaryRecord。
本轮出现的线上报错为:
big fish works items_json 非法: missing field `owner_user_id`
这说明:
- 客户端 record 结构已经把
owner_user_id当成必填字段。 - 某些历史
items_json仍是旧字段集,没有带上owner_user_id。 - 一旦直接按新结构强反序列化,整个 works 列表接口都会失败,而不是只丢失单字段。
根因判断
这不是前端展示问题,也不是 Axum 路由参数问题,而是:
- SpacetimeDB procedure 输出 JSON 的结构发生过升级。
spacetime-client映射层没有为旧 JSON 做向后兼容。- 作品列表是聚合读模型,一条旧记录就可能拖垮整批列表读取。
本次落地口径
本次只做最小风险修复,不改前端契约,不改现有表结构:
-
server-rs/crates/spacetime-client/src/mapper.rs- 大鱼 works 反序列化改为先读兼容结构。
owner_user_id改为兼容层里的可缺省字段。
-
私有 works 列表
- 若旧 JSON 缺
owner_user_id,用当前查询的owner_user_id回填。 - 这样不会破坏创作中心里依赖
ownerUserId的恢复、归属和 key 逻辑。
- 若旧 JSON 缺
-
公开 gallery 列表
- 若旧 JSON 缺
owner_user_id,先回填空串,保证列表接口不再整体失败。 - 后续若公开画廊明确需要作者归属真相,再补模块端回填或数据修复。
- 若旧 JSON 缺
-
新增定向测试
- 覆盖“私有 works 旧 JSON 缺字段仍可回填”
- 覆盖“公开 works 旧 JSON 缺字段不再报错”
经验结论
以后只要是 procedure -> items_json -> client record 这类链路,都要默认遵守下面两条:
- 聚合读模型的 JSON 字段升级不能假设全量历史数据同步完成。
spacetime-client的映射层必须承担兼容旧 JSON 的责任,不能把结构升级风险直接抛给上层接口。
尤其是 works / gallery / library 这种平台入口级接口:
- 允许单字段降级
- 不允许整批列表因单字段缺失而 500 / 400
后续建议
如果后面继续演进大鱼 works 字段,推荐优先遵守:
- 新增字段优先
Option或兼容层解析。 - 聚合 JSON 升级时同步补回归测试。
- 如果字段已经进入前端关键逻辑,再决定是在模块端回填、客户端兜底,还是补历史数据迁移。