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 类型。如果 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函数

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日
许可协议