亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從結構標記驗證返回自定義錯誤消息

從結構標記驗證返回自定義錯誤消息

Go
夢里花落0921 2022-10-17 10:08:44
我正在使用帶有 Gin 的 Go 1.17,我想在將數據發送到我的數據庫之前實現結構驗證。我以Gin 文檔中的示例為例。在結構中,我們可以聲明不同的標簽來驗證一個字段,如下所示:type User struct {    FirstName      string `json:"first_name" binding:"required"`    LastName       string `json:"last_name" binding:"required"`    Age            uint8  `json:"age" binding:"gte=0,lte=130"`    Email          string `json:"email" binding:"required,email"`    FavouriteColor string `json:"favourite_color" binding:"iscolor"`}在處理程序中,我可以抓住這樣的錯誤:var u Userif err := c.ShouldBindWith(&u, binding.Query); err == nil {    c.JSON(http.StatusOK, gin.H{"message": "Good Job"})} else {    c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}錯誤消息將是:{    "error": "Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'required' tag\nKey: 'User.LastName' Error:Field validation for 'LastName' failed on the 'required' tag\nKey: 'User.Email' Error:Field validation for 'Email' failed on the 'required' tag\nKey: 'User.FavouriteColor' Error:Field validation for 'FavouriteColor' failed on the 'iscolor' tag"}錯誤消息太冗長了如何向用戶返回更好的錯誤?我想對 json 響應進行建模,例如:{    "errors": [        "first_name": "This field is required",        "last_name": "This field is required",        "age": "This field is required",        "email": "Invalid email"    ]}
查看完整描述

1 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

Gin gonic 使用該包github.com/go-playground/validator/v10執行綁定驗證。如果驗證失敗,則返回的錯誤為validator.ValidationErrors.

這沒有明確提及,但在模型綁定和驗證中它指出:

Gin 使用 go-playground/validator/v10 進行驗證。在此處查看有關標簽使用的完整文檔。

該鏈接指向go-playground/validator/v10文檔,您可以在其中找到段落Validation Functions Return Type error。

您可以使用標準errors包來檢查錯誤是否是那個,打開它,然后訪問單個字段,即validator.FieldError. 由此,您可以構建任何您想要的錯誤消息。

給定這樣的錯誤模型:

type ApiError struct {

    Field string

    Msg   string

}

你可以這樣做:


    var u User

    err := c.BindQuery(&u);

    if err != nil {

        var ve validator.ValidationErrors

        if errors.As(err, &ve) {

            out := make([]ApiError, len(ve))

            for i, fe := range ve {

                out[i] = ApiError{fe.Field(), msgForTag(fe.Tag())}

            }

            c.JSON(http.StatusBadRequest, gin.H{"errors": out})

        }

        return

    }

使用輔助函數為您的驗證規則輸出自定義錯誤消息:


func msgForTag(tag string) string {

    switch tag {

    case "required":

        return "This field is required"

    case "email":

        return "Invalid email"

    }

    return ""

}

在我的測試中,這輸出:


{

    "errors": [

        {

            "Field": "Number",

            "Msg": "This field is required"

        }

    ]

}

PS:要獲得帶有動態鍵的 json 輸出,您可以使用map[string]string固定結構模型來代替。


查看完整回答
反對 回復 2022-10-17
  • 1 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號