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
go zero路由增加中间件
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
5条回答 默认 最新
关注让【宝码香车】来帮您解答,本回答参考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 } }关键修改点:
- 移除了立即执行函数:去掉了
(),不再立即执行匿名函数 - 返回正确的HandlerFunc:直接返回一个接受
(w http.ResponseWriter, r *http.Request)的函数 - 正确调用原始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, } }这种模式允许您轻松地为路由添加多个中间件,只需层层包装即可。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 移除了立即执行函数:去掉了