这可能只是因为我缺乏经验,但我已经接管了一个用 Go 编写的网络服务器解决方案,但我遇到了一些问题。
路由的设置方式是,每个“顶部”路由都使用 router.Mount() 安装到路由器,每个安装的路由都附加一个处理程序。例子:
router.Mount("/group", (handler.NewGroupHandler(groupSrv, render)).Router())
所以,在这个挂载的路由中,我想添加一个中间件来获取特定的 URL 参数。我已经尝试过了,并按照本指南https://medium.com/@szablowska.patrycja/chi-and-missing-urlparam-in-middleware-9435c48a063b似乎对其他人有用。但是,这对我没有用,我现在怀疑这是因为安装方法。
中间件的想法很简单,只需根据一些要求检查 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)
})
这显然行不通。任何帮助将不胜感激,因为我无法相信安装路由使得无法将中间件添加到子组。
编辑:这工作得很好,只是我没有注册我称之为不受影响的路线。因此,如果其他人最终会遇到同样的问题,请知道这实际上是一种有效的方法。