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



我已经使用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,则工作正常。是否可以只绑定JSON一次?我应该怎么做才能在请求处理程序中再次获得该对象?

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

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

相关内容

最新更新