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

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

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

Go
慕雪6442864 2022-11-23 13:55:27
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贡献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

}


查看完整回答
反对 回复 2022-11-23
?
守候你守候我

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,

    })


}


查看完整回答
反对 回复 2022-11-23
?
繁星点点滴滴

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(),

    })

}


查看完整回答
反对 回复 2022-11-23
  • 3 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

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