发送无效数据时 Gin Gonic 自定义错误消息失败
Gin Gonic Custom Error Message Fails When Invalid Data Sent
验证器结构
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
这个问题与这个问题相关:
但是答案没有意义。
如异常所示,以下行类型转换失败
errs := err.(validator.ValidationErrors)
必须将不同类型的错误传递到函数中,而不是 validator.ValidationErrors
.
因此要么确保其他错误不会传递到 NewValidatorError
。或者做一个更安全的类型检查,比如:
errs, ok := err.(validator.ValidationErrors)
if !ok {
// handles other err type
}
更多信息:A Tour of Go - type assertions, A Tour of Go - type switches
我添加了对 UnmarshalTypeError 的检查,如下所示:
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)
我猜 Golang 在 json 是类型提示时是严格的。它必须是准确的类型,否则会抛出 UnmarshalTypeError
错误。
验证器结构
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
这个问题与这个问题相关:
如异常所示,以下行类型转换失败
errs := err.(validator.ValidationErrors)
必须将不同类型的错误传递到函数中,而不是 validator.ValidationErrors
.
因此要么确保其他错误不会传递到 NewValidatorError
。或者做一个更安全的类型检查,比如:
errs, ok := err.(validator.ValidationErrors)
if !ok {
// handles other err type
}
更多信息:A Tour of Go - type assertions, A Tour of Go - type switches
我添加了对 UnmarshalTypeError 的检查,如下所示:
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)
我猜 Golang 在 json 是类型提示时是严格的。它必须是准确的类型,否则会抛出 UnmarshalTypeError
错误。