You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 04:15:36