浏览 AI 知识库
怎样追踪一个功能从页面、接口到数据库的调用链
页面提示保存成功,刷新后数据却消失,这类问题不能只盯着按钮组件。要沿事件、请求、服务层和数据库写入一路追下去,才能找到断点。
沿完整工作流推进
前一阶段的可检查结果,是下一阶段的输入;中间证据不足时停在当前阶段。
从一个“保存成功”按钮,顺着调用链查到数据为什么没落库
用户点击“保存资料”后页面提示成功,但刷新数据消失。开发者只找到 React 按钮组件,没有追到 API、服务层和数据库事务。
- 页面、接口、服务和数据层均有位置
- 每跳的对象与状态变化可见
- 静态推断与运行证据已区分
先确认这次任务的起点、边界和交付
| 需要确认 | 本例内容 |
|---|---|
| 现有材料 | 复现请求为 `PATCH /api/profile/42`;浏览器返回 200;仓库含前端、Node API 和 PostgreSQL;有请求 ID `req-7f31`。 |
| 不能越过的边界 | 调用链每一跳写文件位置、输入和输出;没有日志或代码证据的关联标为假设;先只读,不改生产数据。 |
| 要交付的结果 | 带文件位置的调用链图 |
从“冻结入口”走到“用日志或测试验证”
| 当前阶段 | 实际处理 |
|---|---|
| 冻结入口 | 记录 URL、按钮、CLI 命令或接口请求,保存输入、用户身份、预期结果和一次真实调用。 |
| 追页面与状态 | 找到事件处理、状态来源、表单校验和请求封装,记文件、符号和触发条件。 |
| 追接口与业务逻辑 | 从路由到认证、校验、服务和错误处理,区分传输结构与业务规则。 |
| 追数据读写 | 确认模型、查询、事务、缓存和外部服务,标出主键、权限和可能副作用。 |
| 用日志或测试验证 | 增加或读取最小诊断证据,确认图上的每一跳真实发生,删掉仅凭命名推测的关系。 |
从‘点击保存’追到数据库,不靠目录名称猜关系
| 层级 | 实际观察 | 证据 | 未知项 |
|---|---|---|---|
| 页面 | `SaveButton` 触发 `handleSubmit` | 浏览器点击与 Network 记录 | 表单校验失败时不会发请求 |
| 接口 | `POST /api/profile` 返回 200 | 请求体、响应体和 request_id | 重试是否会重复提交 |
| 服务 | `updateProfile` 校验昵称后调用仓储 | 文件、函数和日志时间戳 | 缓存失效由哪个模块负责 |
| 数据 | 事务更新 `users` 表并写审计记录 | SQL 日志和测试数据库行变化 | 生产读写路由需负责人确认 |
示例符号是教学用名称;真实调用链必须替换为仓库中实际文件、符号和请求记录。
完成后的带文件位置的调用链图
调用链记录 Button→`profileClient.ts`→PATCH 路由→`profileService.update`→事务。日志显示事务因字段约束回滚,但路由捕获异常后仍返回 200。图上标出错误吞掉的位置和两条待验证修复,不直接改数据库。
为什么“文件链已经画出,真实请求仍对不上”还不能交付
文件链已经画出,真实请求仍对不上
- 原因
- 静态搜索找到同名函数但不是运行路径
- 怎么改
- 用请求 ID、网络面板和日志把运行证据挂到每一跳,删除未执行分支
