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

验证器结构


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捕获时,取消消息打印错误,但是答案没有意义。


慕少森
浏览 111回答 2
2回答

慕桂英3389331

如异常所示,以下行类型转换失败    errs := err.(validator.ValidationErrors)不同类型的错误必须传递到不是验证器的函数中。验证错误。因此,请确保其他错误不会传递到 .或者做一个更安全的类型检查,比如:NewValidatorErrorerrs, ok := err.(validator.ValidationErrors)if !ok {  // handles other err type}

米脂

我添加了对取消封版类型错误的检查,如下所示:    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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go