You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gin中间件Context变量未保留:GetAllUsersTasks中userContext为nil

问题分析与解决方案

问题根源

  1. Authenticate中间件未终止错误请求:当获取JWT Cookie失败或解析Token出错时,你仅打印日志就直接return,但没有终止后续请求流程,也未返回401 Unauthorized状态码。这会导致后续的GetAllUsersTasks依然执行,但此时Context中根本没设置user值,自然会得到<nil>。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:25:28