Files
go-omni/performance/errorInheritanceAcceptance.md

3.3 KiB
Raw Permalink Blame History

v0.11.1-preview App 错误目录继承验收

问题与修复

在 Go 中用 omni.WithErrors 注册目录后,v0.11.0 生成路由无条件创建空目录 Encoder。Context 选择了该空目录,编码阶段又按空目录解析原始错误,造成已配置错误变成 500/英文系统提示。

修复让空 WithErrors 保持 Encoder 不变,生成器仅为非空路由目录绑定策略。Context 原有的 App fallback 因而能够生效;错误目录与响应格式仍独立选择。兼容旧生成代码中的空包装,非空路由目录保持独立、不与 App 合并。

复现与回归

  • 修复前,TestRouteInheritsAppErrorCatalog 的普通路由通过;生成/RawJSON 路由在 Handler 与提前返回中间件两种入口、固定/模板/未知错误三种情况,共 12 项失败,均输出 500 和英文系统提示。
  • 修复后该用例全部通过;包括 HTTP 400/数字 400002/中文提示/data:null,HTTP 200 模板提示,未知错误使用项目配置的中文 INTERNAL_ERROR。
  • 独立路由用例验证相同错误标识使用路由自己的 409/业务码/提示,App 独有标识不渗入;路由的 detail 字段保持独立。
  • EmptyCatalog 编码用例验证完全透传已解析结果,保留原始 error 时也不会二次查空表;非法空目录配置仍拒绝。
  • 实际生成项目的 .api 没有任何 errorCatalog/error 定义。生成 Handler 调用手写 Service;普通路由、生成路由和全局中间件返回体完全一致,含模板参数、未知兜底和 data:null。
  • 生成消费者还覆盖 RawJSON 成功不包装、@errors none 继承 App、手写原文回执、路由 body limit 及超限中文错误、手写 Service 的重生成保护。

本地验证

环境:go1.27.1 darwin/arm64;日期:2026-09-24。

  • GO_OMNI_SCAFFOLD_INTEGRATION=1 go test -race -p=1 -count=1 -timeout=300s ./... 全部通过。
  • go vet ./...、go build ./...、gofmt、git diff --check 通过。

本轮仅本地测试及独立生成消费者,没有修改 eTax/ePay 业务代码,没有访问业务服务器;未重跑外部 Redis/MySQL、Linux soak 或完整业务迁移。

远程固定版本验收

v0.11.1-preview 标签指向 a2a07a39ea045a08a99545b40e4de74b55b98422;发布后从独立、干净的模块缓存安装 CLI,并生成项目执行 race 验收。三个消费者均使用远程固定版本,无本地 replace,校验和一致:

h1:Hz3snXK074stsQno6KUWf1ngAcQI+QNON/pjH0JbwUk=

验收 用时 结果
App 错误目录继承 19.41s 通过;Go 单处注册、普通/生成路由、提前返回中间件、参数提示、未知兜底、独立路由目录及路由请求体限制
错误模板参数 19.76s 通过;类型参数、并发隔离、缺参/错参兜底、原因不外泄、HTTP 200 业务失败及 OpenAPI 示例
业务迁移兼容性 20.16s 通过;动态 JSON、原始体验签、multipart 清理、下载不包装及手写文件保护

各报告记录对应验收脚本与消费者源码的 SHA-256,追加记录时已核对一致。临时项目及缓存已清理;远程模块在本机运行验收,未对业务服务器进行负载测试。报告单独提交至 main,已发布标签保持不可变。