Files
junhong_cmp_fiber/internal/middleware/recover.go
huang 6821e5abcf
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 4m36s
refactor: 统一错误消息数据源,优化错误码与映射表管理
主要改动:
- 改造 errors.New() 和 Wrap() 函数签名为可变参数,优先使用 errorMessages 映射表
- 添加 allErrorCodes 注册表和 init() 启动时校验,确保错误码与映射表一致
- 添加 TestAllCodesHaveMessages 和 TestNoOrphanMessages 测试防止映射表腐化
- 清理 109 处与映射表一致的冗余硬编码(service 层)
- 保留业务特定消息覆盖能力

新增 API 用法:
- errors.New(errors.CodeUnauthorized) // 使用映射表默认消息
- errors.New(errors.CodeNotFound, "提现申请不存在") // 覆盖为自定义消息
2026-01-22 18:27:42 +08:00

56 lines
1.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package middleware
import (
"fmt"
"runtime/debug"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"github.com/break/junhong_cmp_fiber/pkg/constants"
"github.com/break/junhong_cmp_fiber/pkg/errors"
)
// Recover 创建自定义 panic 恢复中间件
// panic 会被转换为 AppError 并传递给 ErrorHandler 统一处理
func Recover(logger *zap.Logger) fiber.Handler {
return func(c *fiber.Ctx) error {
defer func() {
if r := recover(); r != nil {
// 获取请求 ID
requestID := ""
if rid := c.Locals(constants.ContextKeyRequestID); rid != nil {
requestID = rid.(string)
}
// 捕获堆栈跟踪
stack := debug.Stack()
// 记录 panic 信息(包含完整堆栈)
logger.Error("Panic 已恢复",
zap.String("request_id", requestID),
zap.String("method", c.Method()),
zap.String("path", c.Path()),
zap.Any("panic", r),
zap.String("stack", string(stack)),
)
// 将 panic 转换为 AppError
// 注意:这里不直接返回响应,而是返回错误让 ErrorHandler 处理
// 但由于我们在 defer 中,需要通过 c.Next() 返回错误
panicErr := errors.Wrap(
errors.CodeInternalError,
fmt.Errorf("panic: %v", r),
fmt.Sprintf("服务发生异常: %v", r),
)
// 直接调用 ErrorHandler通过返回错误
// Fiber 会将这个错误传递给 ErrorHandler
_ = c.App().Config().ErrorHandler(c, panicErr)
}
}()
return c.Next()
}
}