3 回答
TA贡献1804条经验 获得超2个赞
在这种情况下返回的错误可能不是,validator.ValidationErrors它可能是别的东西。例如,如果正文是无效的 JSON,则根本不会到达验证步骤。
在您的代码中,您正在执行一个未经检查的断言range err.(validator.ValidationErrors),这可能会引起恐慌。
这是您可以有条件地处理错误的方式:
err := ctx.ShouldBindJSON(&bookInput)
if err != nil {
var ve validator.ValidationErrors
if errors.As(err, &ve) {
// handle validator error
}
// handle non-validator error
return
}
TA贡献1802条经验 获得超10个赞
也许它可以帮助:
type BookInput struct {
Title string `json:"title" binding:"required"`
Price interface{} `json:"price" binding:"required,number"`
}
func postBooksHandler(c *gin.Context) {
var bookInput BookInput
err := c.ShouldBindJSON(&bookInput)
if err != nil {
errorMessages := []string{}
for _, e := range err.(validator.ValidationErrors) {
errorMessage := fmt.Sprintf("Error on field %s, conditon: %s", e.Field(), e.ActualTag())
errorMessages = append(errorMessages, errorMessage)
}
c.JSON(http.StatusBadRequest, gin.H{
"error": errorMessages,
})
return
}
c.JSON(http.StatusOK, gin.H{
"title": bookInput.Title,
"price": bookInput.Price,
})
}
TA贡献1803条经验 获得超3个赞
需要为错误创建两个条件,因为validator.ValidationErrors没有涵盖所有内容。
这是我的代码:
if err != nil {
var ve validator.ValidationErrors
if errors.As(err, &ve) {
for _, e := range err.(validator.ValidationErrors) {
c.JSON(http.StatusBadRequest, gin.H{
"error": true,
"message": "" + e.Field() + " kosong",
})
return
}
}
c.JSON(http.StatusBadRequest, gin.H{
"error": true,
"message": err.Error(),
})
}
- 3 回答
- 0 关注
- 245 浏览
添加回答
举报