package middleware import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "nl-video-api/utility/response" ) // ResponseHandler 全局响应处理中间件 // 确保所有响应都返回HTTP 200状态码,错误信息通过code和message字段传递 func ResponseHandler(r *ghttp.Request) { // 设置默认响应头 r.Response.Header().Set("Content-Type", "application/json") // 继续执行后续中间件和处理函数 r.Middleware.Next() // 检查响应状态码,如果不是200,则转换为统一格式 if r.Response.Status != 200 { // 获取原始状态码 originalStatus := r.Response.Status // 根据HTTP状态码映射到业务错误码 var businessCode int var message string switch originalStatus { case 400: businessCode = response.CodeInvalidParam message = "请求参数错误" case 401: businessCode = response.CodeUnauthorized message = "未授权访问" case 403: businessCode = response.CodeForbidden message = "权限不足" case 404: businessCode = response.CodeNotFound message = "资源不存在" case 500: businessCode = response.CodeServerError message = "服务器内部错误" default: businessCode = response.CodeError message = "请求处理失败" } // 清空原有响应内容 r.Response.ClearBuffer() // 返回统一格式的错误响应,HTTP状态码为200 response.Error(r, businessCode, message) } } // ErrorHandler 错误处理中间件 // 捕获panic和其他未处理的错误,统一返回格式 func ErrorHandler(r *ghttp.Request) { defer func() { if err := recover(); err != nil { // 记录错误日志 g.Log().Errorf(r.Context(), "Panic recovered: %v", err) // 清空响应缓冲区 r.Response.ClearBuffer() // 返回统一格式的错误响应 response.Error(r, response.CodeServerError, "系统内部错误") } }() // 继续执行后续中间件和处理函数 r.Middleware.Next() }