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

http://img1.mukewang.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,

  })

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


慕雪6442864
浏览 177回答 3
3回答

慕婉清6462132

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

守候你守候我

也许它可以帮助: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,    })}

繁星点点滴滴

需要为错误创建两个条件,因为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(),    })}
打开App,查看更多内容
随时随地看视频慕课网APP