【问题标题】:Unable to access json data from request in request handler after calling BindJSON in middleware在中间件中调用 BindJSON 后,无法从请求处理程序中的请求访问 json 数据
【发布时间】:2020-10-21 10:48:37
【问题描述】:

我使用 Go-Gin 创建了一个基本的 CRUD API。在请求处理程序中调用 BindJSON 在中间件中调用 BindJSON 后会给我一个空白对象,但如果我在中间件中删除 BindJSON,则可以正常工作。

这是用户模型:

type User struct {
    ID      uint   `json:"id" gorm:"primary_key"`
    Rollnum string `json:"rollnum" gorm:"primary_key;unique"`
    Name    string `json:"name"`
    Email   string `json:"email"`
    Phone   uint   `json:"phone"`
    Address string `json:"address"`
}

这是我的中间件:

func NameMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        var user Models.User
        c.BindJSON(&user)
        fmt.Println(user.Rollnum)
        if user.Name == "" {
            c.JSON(http.StatusNotFound, gin.H{"No Key": "Name"})
            c.AbortWithStatus(http.StatusNotFound)
        }
    }
}

这是我的路线:

r := gin.Default()
grp1 := r.Group("/user-api")
grp1.POST("user", Middleware.NameMiddleware(), Controllers.CreateUser)

这是我的 POST 请求处理程序:

func CreateUser(c *gin.Context) {
    var user Models.User
    c.BindJSON(&user)

    fmt.Println(user)

    err := Models.CreateUser(&user)
    return
}

如果中间件中的 BindJSON 被移除,则可以正常工作。是否可能只能 BindJSON 一次?我应该怎么做才能在我的请求处理程序中再次获取该对象?

【问题讨论】:

    标签: api go middleware go-gin


    【解决方案1】:

    c.bindJSON() 旨在用于初始请求处理程序而不是中间件。如果你愿意,你可以使用上下文 https://www.nicolasmerouze.com/share-values-between-middlewares-context-golang 将数据传递给你的中间件,但我认为这会变得很丑。

    如果您只想对 JSON 执行验证,我建议您在处理程序中执行此逻辑,而不是在中间件中执行。

    【讨论】:

      猜你喜欢
      • 2023-02-17
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      相关资源
      最近更新 更多