gin学习记录-自定义错误信息

自定义错误信息

当校验错误时,根据返回的错误信息自定义一个错误提示返回给前端页面,方便处理。


定义需要用到的结构体

1
2
3
4
5
type SignUserInfo struct {
// 添加验证器 常用的
Name string `json:"name" binding:"required" msg:"昵称不能为空"` // 用户名
Age int `json:"age" binding:"lt=100,gt=0" msg:"年龄不符合要求"` // 年龄
}

封装成独立的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 类型。如果 errvalidator.ValidationErrors 类型或者它的指针类型,则类型断言会返回转换后的 validator.ValidationErrors类型的值和 true。如果 err 不是 validator.ValidationErrors类型或者它的指针类型,则类型断言会返回 validator.ValidationErrors类型的零值和 false

通过 getObj.Elem() 获取结构体的元素类型,因为 getObj 是结构体指针类型的反射对象,
使用 Elem() 方法可以获取指针指向的实际结构体类型。
然后,使用 FieldByName() 方法根据错误字段名 e.Field() 查找结构体中对应的字段。
如果字段存在, f 就是一个包含该字段信息的反射对象,并且 exitstrue 。如果字段不存在,
f 将是零值的反射对象,并且 exitsfalse


main函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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了,全部代码复制粘贴发给他,然后让他一个函数一个函数解释,真是太棒了。


gin学习记录-自定义错误信息
https://kjasn.github.io/2023/08/05/gin学习记录-自定义错误信息/
作者
Kjasn
发布于
2023年8月5日
许可协议