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

使用Golang Chi中间件时控制器无法执行的问题排查与数据传递咨询

问题排查与解决方案

控制器未执行的原因及修复

你的中间件函数缺少对后续处理器的调用,在标准net/http和Chi框架中,中间件必须显式调用next.ServeHTTP(w, r)才能让请求流转到后续的控制器函数,否则请求会在中间件阶段终止,控制器代码不会执行。

修复后的中间件代码:

func Authware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 这里编写你的中间件业务逻辑(如鉴权校验)
        // 关键:调用后续处理器,让请求到达控制器
        next.ServeHTTP(w, r)
    })
}

中间件向控制器传递数据的方法

方法1:使用标准库Context

通过context.WithValue将数据存入请求的Context,控制器从Context中读取:

中间件代码

import "context"

func Authware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 示例:传递用户ID数据
        userID := "u_123456"
        // 创建包含数据的新Context
        newCtx := context.WithValue(r.Context(), "user_id", userID)
        // 使用新Context构建请求,传递给后续处理器
        next.ServeHTTP(w, r.WithContext(newCtx))
    })
}

控制器代码

func Tryon(w http.ResponseWriter, r *http.Request) {
    // 从Context中取出数据,注意类型断言
    userID, ok := r.Context().Value("user_id").(string)
    if !ok {
        log.Println("无法获取用户ID")
        return
    }
    log.Println("当前用户ID:", userID)
    log.Println(1)
}

方法2:使用Chi框架的r.Set/r.Get

Chi为请求对象扩展了Set和Get方法,可直接在请求上存取数据:

中间件代码

func Authware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 使用Chi的r.Set存储数据
        r.Set("user_id", "u_123456")
        next.ServeHTTP(w, r)
    })
}

控制器代码

func Tryon(w http.ResponseWriter, r *http.Request) {
    // 使用Chi的r.Get读取数据
    userID, ok := r.Get("user_id").(string)
    if !ok {
        log.Println("无法获取用户ID")
        return
    }
    log.Println("当前用户ID:", userID)
    log.Println(1)
}

内容的提问来源于stack exchange,提问作者Krushnal Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:33:46