# Tasks: Fiber 错误处理集成

**Feature**: 003-error-handling  
**Generated**: 2025-11-14  
**Status**: Ready for Implementation

## 概述

本文档按用户故事组织实施任务，每个用户故事代表一个独立可测试的增量功能。

**技术栈**: Go 1.25.4, Fiber v2, Zap, GORM, Asynq, PostgreSQL 14+, Redis 6.0+  
**测试策略**: 单元测试 + 集成测试，目标覆盖率 90%+

## 实施策略

- **MVP 范围**: User Story 1 + User Story 2 (P1 优先级)
- **增量交付**: 每完成一个用户故事即可独立测试和部署
- **并行机会**: 标记 [P] 的任务可并行执行

---

## Phase 1: Setup (项目基础设施)

本阶段准备错误处理所需的基础代码结构。

### 任务列表

- [X] T001 审查现有错误处理代码 pkg/errors/errors.go 和 pkg/response/response.go
- [X] T002 审查现有中间件 internal/middleware/recover.go 实现
- [X] T003 确认 Request ID 中间件配置 (cmd/api/main.go 中的 requestid.New())

---

## Phase 2: Foundational (核心基础组件)

本阶段实现所有用户故事依赖的核心组件：错误码定义和错误上下文提取。

**阻塞关系**: 必须在所有用户故事实施前完成

### 任务列表

- [X] T004 创建 pkg/errors/codes.go 定义完整错误码枚举 (CodeSuccess, Code1001-1009, Code2001-2006)
- [X] T005 在 pkg/errors/codes.go 中实现错误消息映射表 errorMessages (中文消息)
- [X] T006 在 pkg/errors/codes.go 中实现 GetHTTPStatus() 函数 (错误码 -> HTTP 状态码映射)
- [X] T007 在 pkg/errors/codes.go 中实现 GetMessage() 函数 (获取错误码对应的消息)
- [X] T008 扩展 pkg/errors/errors.go 中的 AppError 结构体，添加 HTTPStatus 字段
- [X] T009 [P] 在 pkg/errors/errors.go 中实现 AppError.WithHTTPStatus() 方法
- [X] T010 [P] 在 pkg/errors/errors.go 中实现 AppError.Error() 方法 (实现 error 接口)
- [X] T011 [P] 在 pkg/errors/errors.go 中实现 AppError.Unwrap() 方法 (支持错误链)
- [X] T012 创建 pkg/errors/context.go 定义 ErrorContext 结构体
- [X] T013 在 pkg/errors/context.go 中实现 FromFiberContext() 函数 (从 Fiber Ctx 提取错误上下文)
- [X] T014 在 pkg/errors/context.go 中实现 ErrorContext.ToLogFields() 方法 (转换为 Zap 日志字段)
- [X] T015 在 pkg/constants/constants.go 中添加 Request ID 相关常量 (如需补充)
- [X] T016 [P] 为 pkg/errors/codes.go 编写单元测试 (测试错误码映射函数)
- [X] T017 [P] 为 pkg/errors/context.go 编写单元测试 (测试上下文提取逻辑)

**完成标志**: 错误码和错误上下文组件可被其他模块导入使用

---

## Phase 3: User Story 1 - 统一错误响应格式 (P1)

**目标**: 所有 API 错误返回统一的 JSON 格式，包含错误码、消息、时间戳

**独立测试标准**: 调用任意会产生错误的 API 端点，验证返回的 JSON 响应包含标准字段 (code, data, msg, timestamp)，格式一致

### 任务列表

- [X] T018 [US1] 创建 pkg/errors/handler.go 实现 SafeErrorHandler() 函数 (返回 fiber.ErrorHandler)
- [X] T019 [US1] 在 pkg/errors/handler.go 中实现核心错误处理逻辑 handleError()
- [X] T020 [US1] 在 handleError() 中实现响应状态检查 (判断响应是否已发送)
- [X] T021 [US1] 在 handleError() 中实现错误类型分类 (*AppError, *fiber.Error, 其他 error)
- [X] T022 [US1] 在 handleError() 中实现错误消息脱敏逻辑 (5xx 返回通用消息)
- [X] T023 [US1] 在 handleError() 中集成 ErrorContext 提取和日志记录
- [X] T024 [US1] 在 handleError() 中实现统一 JSON 响应生成 (使用 fiber.Map)
- [X] T025 [US1] 在 handleError() 中设置响应 Header X-Request-ID
- [X] T026 [US1] 在 SafeErrorHandler() 中实现 defer + recover 保护机制 (防止 ErrorHandler 自身 panic)
- [X] T027 [US1] 更新 cmd/api/main.go 配置 Fiber ErrorHandler (使用 SafeErrorHandler)
- [X] T028 [US1] 为 pkg/errors/handler.go 编写单元测试 (测试不同错误类型的处理)
- [X] T029 [US1] 创建 tests/integration/error_handler_test.go 测试参数验证失败 -> 400 错误响应
- [X] T030 [US1] 在 tests/integration/error_handler_test.go 中测试资源未找到 -> 404 错误响应
- [X] T031 [US1] 在 tests/integration/error_handler_test.go 中测试认证失败 -> 401 错误响应
- [X] T032 [US1] 在 tests/integration/error_handler_test.go 中验证所有错误响应格式一致性

**完成标志**: 
- 所有 API 错误响应使用统一 JSON 格式
- 集成测试覆盖常见错误场景 (400, 401, 404)
- 错误消息脱敏，不暴露内部细节

---

## Phase 4: User Story 2 - 系统稳定性保障(Panic 恢复) (P1)

**目标**: 捕获所有 panic 异常，防止服务崩溃，记录完整堆栈跟踪

**独立测试标准**: 创建测试端点触发 panic，验证系统返回 500 错误响应，服务继续运行，其他端点正常工作，错误记录到日志

### 任务列表

- [X] T033 [US2] 审查现有 internal/middleware/recover.go 实现，确认是否需要调整
- [X] T034 [US2] 确保 recover 中间件在 Fiber 中间件链的正确位置注册 (ErrorHandler 之后)
- [X] T035 [US2] 在 recover 中间件中添加完整堆栈跟踪记录 (使用 runtime/debug.Stack())
- [X] T036 [US2] 在 recover 中间件中确保 panic 转换为可控的错误响应 (返回 AppError)
- [X] T037 [US2] 验证 recover 中间件与 ErrorHandler 的集成 (panic -> AppError -> ErrorHandler)
- [X] T038 [US2] 为 internal/middleware/recover.go 编写单元测试 (测试 panic 捕获)
- [X] T039 [US2] 在 tests/integration/error_handler_test.go 中创建测试端点触发 panic
- [X] T040 [US2] 在 tests/integration/error_handler_test.go 中测试 panic 恢复后服务继续运行
- [X] T041 [US2] 在 tests/integration/error_handler_test.go 中测试并发场景下的 panic 处理 (多个请求)
- [X] T042 [US2] 在 tests/integration/error_handler_test.go 中验证 panic 时的堆栈跟踪记录
  - **验证堆栈跟踪完整性**:确保日志包含文件名、行号、函数名
  - **验证堆栈深度**:检查是否包含从 panic 发生点到 recover 捕获点的完整调用链
  - **验证格式可读性**:堆栈信息应便于开发人员快速定位问题

**完成标志**: 
- 系统能捕获 100% 的 panic
- 单个请求 panic 不影响其他请求
- 日志包含完整的堆栈跟踪信息

---

## Phase 5: User Story 3 - 业务错误分类处理 (P2)

**目标**: 区分不同类型的错误 (客户端错误、服务端错误)，记录适当的日志级别，返回相应的 HTTP 状态码

**独立测试标准**: 触发不同类型的错误 (验证失败、权限不足、数据库错误)，验证错误分类正确，日志级别匹配 (客户端错误 Warn，服务端错误 Error)，HTTP 状态码正确

### 任务列表

- [X] T043 [P] [US3] 在 pkg/errors/codes.go 中实现 GetLogLevel() 函数 (错误码 -> 日志级别映射)
- [X] T044 [US3] 在 pkg/errors/handler.go 中集成 GetLogLevel(),根据错误类型记录不同日志级别
- [X] T045 [P] [US3] 在 tests/integration/error_handler_test.go 中测试参数验证失败 -> Warn 级别日志
- [X] T046 [P] [US3] 在 tests/integration/error_handler_test.go 中测试权限不足 -> Warn 级别日志
- [X] T047 [P] [US3] 在 tests/integration/error_handler_test.go 中测试数据库错误 -> Error 级别日志
- [X] T048 [US3] 在 tests/integration/error_handler_test.go 中验证敏感信息隐藏 (数据库错误不暴露 SQL)
- [X] T049 [US3] 在 tests/integration/error_handler_test.go 中测试限流错误 -> 429 响应
- [X] T050 [US3] 在 tests/integration/error_handler_test.go 中测试服务不可用 -> 503 响应

**完成标志**: 
- 客户端错误 (1xxx) 记录为 Warn 级别，返回 4xx 状态码
- 服务端错误 (2xxx) 记录为 Error 级别，返回 5xx 状态码
- 敏感信息不暴露给客户端

---

## Phase 6: User Story 4 - 错误追踪和调试支持 (P3)

**目标**: 错误日志包含完整的请求上下文 (Request ID, 路径, 参数)，便于快速定位和排查问题

**独立测试标准**: 触发一个错误，在日志中搜索 request_id，验证能找到完整的请求上下文 (路径、方法、参数) 和错误详情

### 任务列表

- [X] T051 [P] [US4] 在 pkg/errors/context.go 中完善 ErrorContext 字段 (确保包含所有调试信息)
- [X] T052 [US4] 在 pkg/errors/handler.go 中确保错误日志包含所有 ErrorContext 字段
- [X] T053 [US4] 在 pkg/errors/handler.go 中添加请求参数记录 (Query 和 Body，限制 50KB)
- [X] T054 [US4] 在 tests/integration/error_handler_test.go 中测试错误日志完整性 (包含 Request ID)
- [X] T055 [US4] 在 tests/integration/error_handler_test.go 中测试请求上下文记录 (路径、方法、参数)
- [X] T056 [US4] 在 tests/integration/error_handler_test.go 中测试 panic 堆栈跟踪记录 (指明 panic 位置)
- [X] T057 [US4] 在 tests/integration/error_handler_test.go 中测试使用 Request ID 追踪请求流程

**完成标志**: 
- 所有错误日志包含 Request ID
- 日志包含完整的请求上下文 (路径、方法、参数)
- Panic 日志包含完整的堆栈跟踪

---

## Phase 7: Polish & Cross-Cutting Concerns

本阶段完善文档、性能优化和最终验证。

### 任务列表

- [X] T058 运行所有单元测试并验证覆盖率 > 90% (pkg/errors/ 包)
- [X] T059 运行所有集成测试并验证所有场景通过
- [X] T060 运行性能基准测试，验证错误处理延迟 < 1ms (P95)
- [X] T061 在高并发场景下测试错误处理 (1000+ 并发请求)
- [X] T062 [P] 创建 docs/003-error-handling/功能总结.md (功能概述、核心实现、技术要点)
- [X] T063 [P] 创建 docs/003-error-handling/使用指南.md (如何使用错误处理机制)
- [X] T064 [P] 创建 docs/003-error-handling/架构说明.md (错误处理架构设计，可选)
- [X] T065 更新 README.md 添加错误处理功能的简短描述 (2-3 句话)
- [X] T066 更新 CLAUDE.md 添加错误处理相关技术栈信息 (如需)
- [X] T067 代码审查：验证所有注释和日志消息使用中文
- [X] T068 代码审查：验证没有硬编码的魔术数字或字符串 (3+ 次出现必须定义为常量)
- [X] T069 运行 `go fmt` 和 `golangci-lint` 检查代码质量
- [X] T070 最终验证：所有 Success Criteria (SC-001 到 SC-008) 已满足

---

## 依赖关系图

```
Setup (T001-T003)
  ↓
Foundational (T004-T017) ← 阻塞所有用户故事
  ↓
  ├→ User Story 1 (T018-T032) [P1] ← MVP 核心
  ├→ User Story 2 (T033-T042) [P1] ← MVP 核心
  ↓
  ├→ User Story 3 (T043-T050) [P2] ← 依赖 US1, US2
  ├→ User Story 4 (T051-T057) [P3] ← 依赖 US1, US2
  ↓
Polish (T058-T070) ← 依赖所有用户故事完成
```

**关键路径**: Setup → Foundational → US1 → US2 → US3 → US4 → Polish

**并行机会**:
- US1 阶段: T028 单元测试可与 T029-T032 集成测试并行
- US2 阶段: T038 单元测试可与 T039-T042 集成测试并行
- US3 阶段: T045, T046, T047 测试任务可并行执行
- US4 阶段: T054-T057 测试任务可并行执行
- Polish 阶段: T062, T063, T064 文档编写可并行执行

---

## 任务统计

- **总任务数**: 70 个任务
- **Setup**: 3 个任务
- **Foundational**: 14 个任务
- **User Story 1 (P1)**: 15 个任务
- **User Story 2 (P1)**: 10 个任务
- **User Story 3 (P2)**: 8 个任务
- **User Story 4 (P3)**: 7 个任务
- **Polish**: 13 个任务
- **可并行任务**: 18 个任务 (标记 [P])

**MVP 范围**: T001-T042 (Setup + Foundational + US1 + US2) = 42 个任务

**预估时间**:
- MVP (US1 + US2): 2-3 天
- 完整功能 (US1-US4): 4-5 天
- 包含文档和优化: 5-6 天

---

## 实施建议

1. **优先完成 MVP**: 先实现 US1 和 US2 (P1 优先级)，确保核心错误处理和 panic 恢复功能可用
2. **增量测试**: 每完成一个用户故事立即进行集成测试，确保功能正确
3. **并行执行**: 利用标记 [P] 的任务并行开发，提高效率
4. **代码审查**: 在进入下一个用户故事前，审查当前代码质量
5. **性能验证**: 在 Polish 阶段进行性能测试，确保错误处理延迟 < 1ms

---

## 成功标准验证

完成所有任务后，验证以下成功标准:

- ✅ **SC-001**: 系统能够捕获 100% 的 panic (US2)
- ✅ **SC-002**: 所有 API 错误响应格式一致 (US1)
- ✅ **SC-003**: 错误日志记录率 100% (US1, US4)
- ✅ **SC-004**: 客户端能通过错误码识别错误类型 (US1, US3)
- ✅ **SC-005**: 5 分钟内通过 Request ID 定位错误 (US4)
- ✅ **SC-006**: 错误处理延迟 < 1ms (所有 US)
- ✅ **SC-007**: 错误响应不包含敏感信息 (US1, US3)
- ✅ **SC-008**: 高并发下错误处理不成为瓶颈 (US2, Polish)

---

**文档版本**: 1.0  
**最后更新**: 2025-11-14  
**下一步**: 运行 `/speckit.implement` 开始执行任务
