showliuzp 2025-09-19 20:42 采纳率: 84.3%
浏览 4
已结题

go zero路由增加中间件


func Router() (r []rest.Route) {
    login_chk := services.NewLogin()

    r = []rest.Route{     
        add_router(types.POST, "/members/list", response.WrapResponse(MembersList,login_chk.RouterCheckToken))
        }

func add_router(method_type string, path string, handler http.HandlerFunc) rest.Route {
    return rest.Route{
        Method:  method_type,
        Path:    types.Admin_Http_URL_Prefix + path,
        Handler: test(method_type,path,handler),
    }
}

func test(method_type string, path string, handler http.HandlerFunc) http.HandlerFunc{
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Printf("执行")
        return handler
    }())
}

我想在add_route的Handel上增加与一个中间件,试着写了一个,但报错:func(w http.ResponseWriter, r *http.Request) {…}() (no value) used as value
  • 写回答

5条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-09-19 20:43
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:把烦恼留在昨天,今天只负责快乐。
    .

    根据您提供的代码和错误信息,问题在于您的中间件函数 test 的实现方式不正确。您试图立即执行一个匿名函数并返回其结果,而不是返回一个包装后的 http.HandlerFunc

    以下是修复后的代码:

    func Router() []rest.Route {
        login_chk := services.NewLogin()
    
    
        r := []rest.Route{     
            add_router(types.POST, "/members/list", response.WrapResponse(MembersList, login_chk.RouterCheckToken)),
        }
        return r
    }
    
    
    func add_router(method_type string, path string, handler http.HandlerFunc) rest.Route {
        return rest.Route{
            Method:  method_type,
            Path:    types.Admin_Http_URL_Prefix + path,
            Handler: test(method_type, path, handler), // 这里传递的是包装后的handler
        }
    }
    
    
    // 正确的中间件实现
    func test(method_type string, path string, handler http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            fmt.Printf("执行方法: %s, 路径: %s\n", method_type, path)
            handler(w, r) // 调用原始handler
        }
    }
    

    关键修改点:

    1. 移除了立即执行函数:去掉了 (),不再立即执行匿名函数
    2. 返回正确的HandlerFunc:直接返回一个接受 (w http.ResponseWriter, r *http.Request) 的函数
    3. 正确调用原始handler:在中间件内部调用 handler(w, r) 来继续处理请求

    如果您需要更通用的中间件模式(不依赖特定参数),可以这样实现:

    // 通用中间件函数
    func middleware(next http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            fmt.Println("执行中间件逻辑")
            // 这里可以添加前置处理逻辑
            
            next(w, r) // 继续执行下一个handler
            
            // 这里可以添加后置处理逻辑
        }
    }
    
    
    // 使用方式
    func add_router(method_type string, path string, handler http.HandlerFunc) rest.Route {
        wrappedHandler := middleware(handler) // 包装原始handler
        
        return rest.Route{
            Method:  method_type,
            Path:    types.Admin_Http_URL_Prefix + path,
            Handler: wrappedHandler,
        }
    }
    

    这种模式允许您轻松地为路由添加多个中间件,只需层层包装即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 9月27日
  • 已采纳回答 9月19日
  • 创建了问题 9月19日