Gin中间件Context变量未保留:GetAllUsersTasks中userContext为nil
问题分析与解决方案
问题根源
Authenticate中间件未终止错误请求:当获取JWT Cookie失败或解析Token出错时,你仅打印日志就直接return,但没有终止后续请求流程,也未返回401 Unauthorized状态码。这会导致后续的GetAllUsersTasks依然执行,但此时Context中根本没设置user值,自然会得到<nil>。GetAllUsersTasks错误处理不完整:当获取user失败时,你只设置了状态码但没有return,后续代码依然会执行,这会触发空指针panic。
修复方案
1. 完善Authenticate中间件的错误处理
修改user.go中的Authenticate函数,出错时返回401状态并终止请求链:
func Authenticate(c *gin.Context) { cookieString, err := c.Cookie("jwt") if err != nil { log.Println(err.Error()) c.Status(http.StatusUnauthorized) c.Abort() // 终止后续中间件和handler执行 return } user, err := getUserFromToken(cookieString) if err != nil { log.Println(err.Error()) c.Status(http.StatusUnauthorized) c.Abort() // 终止后续中间件和handler执行 return } c.Set("user", *user) }
2. 补全GetAllUsersTasks的错误返回逻辑
修改task.go中的GetAllUsersTasks函数,确保出错后立即返回:
func GetAllUsersTasks(c *gin.Context) { userContext, ok := c.Get("user") if !ok { c.Status(http.StatusUnauthorized) return // 出错后立即返回,避免后续代码执行 } u, ok := userContext.(db.User) if !ok { c.Status(http.StatusUnauthorized) return // 出错后立即返回 } allTasks, err := database.GetAllTasksByOwnerId(u.Id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"GetAllTasksByOwnerId": err.Error()}) return } c.JSON(http.StatusOK, allTasks) }
内容的提问来源于stack exchange,提问作者Fifips
相关产品推荐
相关产品推荐

