为了账号安全,请及时绑定邮箱和手机立即绑定

接口转换:error是*errors.errorString,不是validator.

接口转换:error是*errors.errorString,不是validator.

Go
慕雪6442864 2022-11-23 13:55:27

http://img1.sycdn.imooc.com/637db5ea0001ca2613660673.jpg

type BookInput struct {

  Title string `json:"title" binding:"required"`

  Price json.Number `json:"price" binding:"required,number"`

}


func PostBookHandler(ctx *gin.Context) {

  var bookInput book.BookInput


  err := ctx.ShouldBindJSON(&bookInput)


  if err != nil {

    errorMessages := []string{}


    for _, e := range err.(validator.ValidationErrors) {

        errorMessage := fmt.Sprintf("Error on filed %s, condition: %s", e.Field(), e.ActualTag())

        errorMessages = append(errorMessages, errorMessage)

    }


    ctx.JSON(http.StatusBadRequest, gin.H {

        "errors": errorMessages, 

    })

    return

  }


  ctx.JSON(http.StatusOK, gin.H {

    "title": bookInput.Title,

    "price": bookInput.Price,

  })

我试图验证价格输入,但得到的结果出乎意料。我写的代码和上面的一样,有人可以帮我吗?


查看完整描述

3 回答

?
慕婉清6462132

TA贡献1502条经验 获得超1个赞

在这种情况下返回的错误可能不是,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

}


查看完整回答
反对 回复 5天前
?
守候你守候我

TA贡献1508条经验 获得超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,

    })


}


查看完整回答
反对 回复 5天前
?
繁星点点滴滴

TA贡献1526条经验 获得超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(),

    })

}


查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信