首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在中间件中调用BindJSON后,无法从请求处理程序中的请求访问json数据

在中间件中调用BindJSON后,无法从请求处理程序中的请求访问json数据
EN

Stack Overflow用户
提问于 2020-10-21 18:48:38
回答 1查看 49关注 0票数 0

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

这是用户模型:

代码语言:javascript
复制
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"`
}

这是我的中间件:

代码语言:javascript
复制
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)
        }
    }
}

这是我的路线:

代码语言:javascript
复制
r := gin.Default()
grp1 := r.Group("/user-api")
grp1.POST("user", Middleware.NameMiddleware(), Controllers.CreateUser)

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

代码语言:javascript
复制
func CreateUser(c *gin.Context) {
    var user Models.User
    c.BindJSON(&user)

    fmt.Println(user)

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

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

EN

回答 1

Stack Overflow用户

发布于 2020-10-24 07:17:40

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64461951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档