自定义错误信息
- 当校验错误时,根据返回的错误信息自定义一个错误提示返回给前端页面,方便处理。
定义需要用到的结构体
type SignUserInfo struct {
// 添加验证器 常用的
Name string `json:"name" binding:"required" msg:"昵称不能为空"` // 用户名
Age int `json:"age" binding:"lt=100,gt=0" msg:"年龄不符合要求"` // 年龄
}
封装成独立的函数
func GetValidMsg(err error, user SignUserInfo) string {
// 将err接口断言为具体类型
if errs, ok := err.(validator.ValidationErrors); ok {
getObj := reflect.TypeOf(&user)
fmt.Println("类型为:", getObj)
// 断言成功
for _, e := range errs { // 遍历每一个错误信息 报错信息可能有多个
// 根据报错字段名,获取结构体的具体字段
if f, exits := getObj.Elem().FieldByName(e.Field()); exits {
msg := f.Tag.Get("msg")
fmt.Println(msg)
return msg
} f f, exits := getObj.Elem().FieldByName(e.Field()); exits {
msg := f.Tag.Get("msg")
fmt.Println(msg)
return msg
}
}
}
return "" // 没有检查到验证器错误则返回空
}
validator.ValidationErrors 是一个错误类型,用于存储验证器验证失败的错误信息 err.(validator.ValidationErrors) 表示
将 err 转换为 validator.ValidationErrors 类型。如果 err 是 validator.ValidationErrors 类型或者它的指针类型,则类型断言会返回转换后的 validator.ValidationErrors类型的值和 true。如果 err 不是 validator.ValidationErrors类型或者它的指针类型,则类型断言会返回 validator.ValidationErrors类型的零值和 false。
通过 getObj.Elem() 获取结构体的元素类型,因为 getObj 是结构体指针类型的反射对象,
使用 Elem() 方法可以获取指针指向的实际结构体类型。
然后,使用 FieldByName() 方法根据错误字段名 e.Field() 查找结构体中对应的字段。
如果字段存在, f 就是一个包含该字段信息的反射对象,并且 exits 为 true 。如果字段不存在,
f 将是零值的反射对象,并且 exits 为 false 。
main函数
func main() {
router := gin.Default()
router.POST("/check", func(c *gin.Context) {
fmt.Println("访问...")
var user SignUserInfo
err := c.ShouldBindJSON(&user) // 返回error信息,不报错则返回空
if err != nil {
customErr := GetValidMsg(err, user) // 自定义的错误信息
c.JSON(http.StatusBadRequest, gin.H{"msg": customErr})
return
}
c.JSON(http.StatusOK, gin.H{"data": user})
})
err := router.Run(":80")
if err != nil {
return
}
}
截图如下:
写在最后
文章引自个人博客,担心被认为引流,这里就不放博客链接了~
学习这一节的时候看不懂,看源码也看不明白,这个时候最可靠的就是chatGPT了,全部代码复制粘贴发给他,然后让他一个函数一个函数解释,真是太棒了。