1.8 KiB
1.8 KiB
跨层契约思考指南
本仓库的最小链路是:
FastAPI 路由
→ Pydantic response model
→ 同源 /api/v1 代理
→ requestJson<T>
→ feature *.types.ts / *.api.ts
→ React Query hook
→ 页面加载、错误、成功状态
以系统状态为例,链路对应:
- 后端:
interfaces/http/router.py挂载/api/v1/system/status,interfaces/http/system.py返回SystemStatusResponse。 - 后端测试:
tests/test_system_http.py断言状态码和完整 JSON。 - 前端:
features/system/api/system.api.ts使用/api/v1/system/status,system.types.ts描述字段,system.query.ts管理缓存。 - 页面测试:
system-status-page.test.tsx断言“运行正常”和环境文本。
修改 HTTP 字段前
- 找到后端响应模型、路由和现有契约测试。
- 找到 feature API 函数、TypeScript 类型、query hook 和页面分支。
- 确认开发 Vite 代理和生产 Nginx 仍覆盖该路径;浏览器代码保持同源路径。
- 同步更新后端 HTTP 测试和前端行为测试,再运行两端质量命令。
常见跨层遗漏
- 只修改 Pydantic 字段,没有修改
*.types.ts,导致 UI 仍读取旧形状。 - 把
/api/v1改成后端绝对 URL,绕过vite.config.ts和 Nginx 的同源代理。 - 在页面内直接
fetch,绕过requestJson的ApiError和AbortSignal。 - 用 Zustand 缓存服务器响应,造成 React Query 缓存与全局 store 的双重事实来源。
- 只测试请求成功,没有测试
isPending、isError或字段缺失时的安全展示。
边界验证
提交前至少回答:输入在哪里解析?错误在哪里转换?状态由谁拥有?字段是否在后端、客户端类型和 UI 测试中一致?如果答案不清楚,先补充契约或拆分边界,再实现功能。