为了账号安全,请及时绑定邮箱和手机立即绑定

Gin Gonic 自定义错误消息在发送无效数据时失败

Gin Gonic 自定义错误消息在发送无效数据时失败

Go
慕少森 2022-10-04 16:52:11
验证器结构type RegisterValidator struct {    Name              string     `form:"name" json:"name" binding:"required,min=4,max=50"`    Email             string     `form:"email" json:"email" binding:"required,email,min=4,max=50"`    Password          string     `form:"password" json:"password" binding:"required,min=8,max=50"`    MobileCountryCode int        `form:"mobile_country_code" json:"mobile_country_code" binding:"required,gte=2,lt=5"`    Mobile            int        `form:"mobile" json:"mobile" binding:"required,gte=5,lt=15"`    UserModel         users.User `json:"-"`}设置自定义错误的格式,如下所示:type CustomError struct {    Errors map[string]interface{} `json:"errors"`}func NewValidatorError(err error) CustomError {    res := CustomError{}    res.Errors = make(map[string]interface{})    errs := err.(validator.ValidationErrors)    for _, v := range errs {        param := v.Param()        field := v.Field()        tag := v.Tag()        if param != "" {            res.Errors[field] = fmt.Sprintf("{%v: %v}", tag, param)        } else {            res.Errors[field] = fmt.Sprintf("{key: %v}", tag)        }    }    return res}当发送的数据是{    "email": "me@example.com",    "name": "John Doe",    "mobile_country_code": 1,    "mobile": 1234567}但发送无效类型{    "email": "me@example.com",    "name": "John Doe",    "mobile_country_code": "1",    "mobile": 1234567}抛出错误interface conversion: error is *json.UnmarshalTypeError, not validator.ValidationErrors这个问题与此问题有关:如何断言错误类型 json。当被杜松子酒c.BindJSON捕获时,取消消息打印错误,但是答案没有意义。
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞


如异常所示,以下行类型转换失败


    errs := err.(validator.ValidationErrors)

不同类型的错误必须传递到不是验证器的函数中。验证错误。


因此,请确保其他错误不会传递到 .或者做一个更安全的类型检查,比如:NewValidatorError


errs, ok := err.(validator.ValidationErrors)

if !ok {

  // handles other err type

}


查看完整回答
反对 回复 2022-10-04
?
米脂

TA贡献1836条经验 获得超3个赞

我添加了对取消封版类型错误的检查,如下所示:


    if reflect.TypeOf(err).Elem().String() == "json.UnmarshalTypeError" {

        errs := err.(*json.UnmarshalTypeError)

        res.Errors[errs.Field] = fmt.Sprintf("{key: %v}", errs.Error())


        return res

    }


    errs := err.(validator.ValidationErrors)


我猜当json是类型提示时,戈兰是严格的。它必须是确切的类型,否则它将引发错误。UnmarshalTypeError


查看完整回答
反对 回复 2022-10-04
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信