Go 将中间件连接到安装到路由器的路由
这可能只是因为我缺乏经验,但我已经接管了一个用Go编写的web服务器解决方案,我遇到了一些问题 路由的设置方式是,使用router.Mount()将每个“顶部”路由安装到路由器上,并将处理程序连接到每个安装的路由上。例如:Go 将中间件连接到安装到路由器的路由,go,go-chi,Go,Go Chi,这可能只是因为我缺乏经验,但我已经接管了一个用Go编写的web服务器解决方案,我遇到了一些问题 路由的设置方式是,使用router.Mount()将每个“顶部”路由安装到路由器上,并将处理程序连接到每个安装的路由上。例如: router.Mount("/group", (handler.NewGroupHandler(groupSrv, render)).Router()) 因此,在这个挂载的路由中,我想添加一个中间件来获取一个特定的URL参数。我已经试过了,并且遵循了这个指南,它似乎对其他人
router.Mount("/group", (handler.NewGroupHandler(groupSrv, render)).Router())
因此,在这个挂载的路由中,我想添加一个中间件来获取一个特定的URL参数。我已经试过了,并且遵循了这个指南,它似乎对其他人有用。然而,这对我来说不起作用,我现在怀疑这是因为安装的方法
中间件的思想非常简单,只需根据一些需求检查URL参数。当然,我可以在每一条路径上手动完成这项工作,但对于可读性和未来的开发来说,中间件会更好。中间件的编写方式:
func GroupMiddleware() func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
groupIDStr := chi.URLParam(r, "group_id")
if checkAgainstGroupID {
// Do something, raise error
} else {
next.ServeHTTP(w, r)
}
}
return http.HandlerFunc(fn)
}
}
然后像这样应用:
r.With(subhandler.GroupMiddleware).Route("/{group_id}", func(r chi.Router) {
r.Get("/", h.get)
})
这显然不起作用。如果有任何帮助,我将不胜感激,因为我不相信安装路由会导致无法向子组添加中间件
编辑:这是完美的工作,只是我没有注册,我称之为未受影响的路线。因此,如果其他人最终会遇到同样的问题,请知道这实际上是一种有效的方法。我怀疑问题在于执行顺序(
GroupMiddleware
在路由提取{group\u id}
之前运行)。尝试将调用移动到闭包中的中间件(即r.Use(GroupMiddleware)
就在r.Get…
)谢谢您的评论@Brits。这让我又看了一遍,你不知道吗?我的原始代码工作得很好,只是我昨天晚上愚蠢地坐在那里,试图调用中间件中未包含的组路由的一部分。