我已经使用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一次?我应该怎么做才能在我的请求处理程序中再次获得该对象?
发布于 2020-10-24 07:17:40
c.bindJSON()旨在用于初始请求处理程序中,而不是在中间件中。如果您愿意,您可以使用context https://www.nicolasmerouze.com/share-values-between-middlewares-context-golang将数据传递到您的中间件,但我认为这可能会变得丑陋。
如果您只想对JSON执行验证,我建议您在处理程序中而不是在中间件中执行此逻辑。
https://stackoverflow.com/questions/64461951
复制相似问题