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 關注
- 283 瀏覽
添加回答
舉報