验证错误在 Go Gin 框架中被捕获为解码错误

问题描述 投票:0回答:1

我使用 Go 中的 Gin 框架来绑定和验证传入的 JSON 请求。但是,我遇到了一个问题,验证错误被捕获为解码错误。具体来说,当发生验证错误时,该错误将被视为请求正文解码失败而不是验证失败。

这是我当前的代码:

func checkPostReq(ctx *gin.Context, req any) (string, error) {
    if err := ctx.ShouldBindJSON(req); err != nil {
        var validationErrs validator.ValidationErrors
        if errors.As(err, &validationErrs) {
            // Handle validation error
            err = apperror.WrapValidationErr(validationErrs)
        } else {
            // Handle decoding error
            err = apperror.ReqBodyDecodeFailed.Wrap(err, "failed to decode request body")
        }
        ctx.JSON(http.StatusBadRequest, apperror.ErrorResponse(ctx, err))
        return "", err
    }

    uidStr, err := checkUid(ctx)
    if err != nil {
        ctx.JSON(http.StatusUnauthorized, apperror.ErrorResponse(ctx, err))
        return "", err
    }

    return uidStr, nil
}

当我故意触发验证错误时,错误消息如下所示:

ERROR "Key: 'CreatePostRequest.MainCategory' Error:Field validation for 'MainCategory' failed on the 'required' tag"

但它不是将其视为验证错误,而是被视为解码错误,并且执行 ReqBodyDecodeFailed 分支。

问题: 为什么验证错误会被捕获为解码错误? 使用 ShouldBindJSON 时是否有更好的方法来区分验证错误和解码错误? 如何确保正确处理验证错误? 预先感谢!

go go-gin
1个回答
0
投票

该问题是由我的项目中使用的验证器包与 gin/binding 使用的验证器包之间的版本不匹配引起的。更新验证器版本以匹配后,问题得到解决。

© www.soinside.com 2019 - 2024. All rights reserved.