使用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
相关产品推荐
相关产品推荐

