Golang Echo框架使用BodyDumpConfig时错误响应体重复问题求助
Echo框架启用BodyDump中间件后错误响应重复的问题解决
问题原因
Echo的BodyDump中间件通过包装ResponseWriter捕获响应体,在请求处理周期结束时,会将捕获到的响应体写入原始响应流。而你的自定义HTTPErrorHandler直接调用c.JSON写入响应,导致了两次输出:
- 自定义处理器先将错误JSON写入BodyDump的包装Writer中
- BodyDump中间件在后续流程里,又把捕获到的响应体重复写入原始响应流,最终出现重复的JSON结构
解决方案
方案1:交给Echo默认流程处理响应
调整错误处理器,不要直接调用c.JSON,而是构造错误对象后通过c.Error()让Echo完成响应写入,确保BodyDump只捕获到一次响应:
func HTTPErrorHandler(err error, c echo.Context) { var apiErr *APIError switch t := err.(type) { case *echo.HTTPError: apiErr = NewAPIError(t.Code, fmt.Sprint(t.Message)).internal(t.Internal) case *APIError: apiErr = t default: apiErr = err != nil ? ErrUnknown.internal(err.Error()) : ErrUnknown } // 构造标准HTTPError,交给Echo处理响应 c.Error(&echo.HTTPError{ Code: apiErr.httpCode, Message: apiErr, Internal: err, }) }
方案2:标记响应已提交
如果坚持直接用c.JSON写入响应,在写入后标记响应已提交,让BodyDump中间件停止后续的重复写入操作:
func HTTPErrorHandler(err error, c echo.Context) { switch t := err.(type) { case *echo.HTTPError: c.JSON(t.Code, NewAPIError(t.Code, fmt.Sprint(t.Message)).internal(t.Internal)) case *APIError: c.JSON(t.httpCode, t) default: if err == nil { c.JSON(http.StatusInternalServerError, ErrUnknown) } else { c.JSON(http.StatusInternalServerError, ErrUnknown.internal(err.Error())) } } // 标记响应已完成,阻止BodyDump重复输出 c.Response().Committed = true }
验证
修改代码后重新启用BodyDump中间件,测试错误场景,响应JSON将不再出现重复。
内容的提问来源于stack exchange,提问作者BJKang
相关产品推荐
相关产品推荐

