我使用 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 时是否有更好的方法来区分验证错误和解码错误? 如何确保正确处理验证错误? 预先感谢!
该问题是由我的项目中使用的验证器包与 gin/binding 使用的验证器包之间的版本不匹配引起的。更新验证器版本以匹配后,问题得到解决。