Go 将中间件连接到安装到路由器的路由

Go 将中间件连接到安装到路由器的路由,go,go-chi,Go,Go Chi,这可能只是因为我缺乏经验,但我已经接管了一个用Go编写的web服务器解决方案,我遇到了一些问题 路由的设置方式是,使用router.Mount()将每个“顶部”路由安装到路由器上,并将处理程序连接到每个安装的路由上。例如: router.Mount("/group", (handler.NewGroupHandler(groupSrv, render)).Router()) 因此,在这个挂载的路由中,我想添加一个中间件来获取一个特定的URL参数。我已经试过了,并且遵循了这个指南,它似乎对其他人

这可能只是因为我缺乏经验,但我已经接管了一个用Go编写的web服务器解决方案,我遇到了一些问题

路由的设置方式是,使用router.Mount()将每个“顶部”路由安装到路由器上,并将处理程序连接到每个安装的路由上。例如:

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。这让我又看了一遍,你不知道吗?我的原始代码工作得很好,只是我昨天晚上愚蠢地坐在那里,试图调用中间件中未包含的组路由的一部分。