为了账号安全,请及时绑定邮箱和手机立即绑定

从中间件获取 gorilla/mux 路由器当前路由名称

从中间件获取 gorilla/mux 路由器当前路由名称

Go
www说 2021-09-10 16:57:58
问题: 无法从中间件访问 mux.CurrentRoute(r).GetName()。(虽然我已经能够从我的中间件访问它,但由于它以前无法访问请求,我不得不改变我的中间件的工作方式)。所以我搞砸了一些事情,但我不确定如何回到可以访问路线名称的工作状态。任何帮助将非常感激!错误:runtime error: invalid memory address or nil pointer dereference 代码:func main() {    var (        err          error        r            *mux.Router        devRouter    *mux.Router        usersRouter  *mux.Router        brandsRouter *mux.Router    )    defer db.Close()    defer store.Close()    r = mux.NewRouter()    devRouter = r.PathPrefix("/api/v1/dev").Subrouter()    usersRouter = r.PathPrefix("/api/v1/users").Subrouter()    brandsRouter = r.PathPrefix("/api/v1/brands").Subrouter()    // development endpoints    devRouter.HandleFunc("/db/seed", devDbSeed)    ...    // users    usersRouter.HandleFunc("/create", usersCreateHandlerFunc).Methods("POST").Name("USERS_CREATE")    ...    // brands    brandsRouter.HandleFunc("/create", brandsCreateHandlerFunc).Methods("POST").Name("BRANDS_CREATE")    ...    // products    brandsRouter.HandleFunc("/{brand_id:[0-9]+}/products", brandsProductsListHandlerFunc).Methods("GET").Name("BRANDS_PRODUCTS_LIST")    ...    // mwAuthorize and mwAuthenticate basically work the same    mw := []func(http.Handler) http.Handler{mwAuthenticate, mwAuthorize}    http.Handle("/", use(r, mw...))    err = http.ListenAndServe(":9000", nil)    if err != nil {         logIt(err)    }}更新(2015-01-04 @ 4:49PM EST):因此在删除中间件(或至少注释掉试图读取 mux.CurrentRoute 的部分)后,我能够从目标 handlerfunc 中检索路由名称(例如: usersCreateHandlerFunc 或brandsCreateHandlerFunc)。这并没有解决我的问题(我仍然想在中间件中执行身份验证/授权而不是每个 handlerfunc),我有一种预感,它让我知道 *mux.Router 在我的中间件中不可用,直到最终完成.ServeHTTP 调用。(或类似的规定...)更新 (2015-01-04 @ 5:41PM EST):尝试使用 Negroni 作为中间件组件的不同(尽管不太受欢迎)的方向。当我尝试获取 mux.CurrentRoute 时仍然出现 nil-pointer 错误。更新 (2015-01-04 @ 6:17PM EST):我可以从中间件 func 访问请求(例如:r.URL),但仍然无法访问 mux.Route(例如:mux.CurrentRoute( r))。在查看了多路复用源之后,我认为这是因为当前的多路复用上下文没有被设置,因为路由器还没有执行匹配器(因此它不知道它当前在什么路由上,直到中间件之后已完成)。但是,我仍然不确定如何解决这个问题,或者重新构建我的代码来处理这个问题。
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

我遇到了同样的问题,我以这种方式解决了:


var match mux.RouteMatch

routeExists := s.Router.Match(r, &match)

if routeExists && match.Route.GetName(){

    routeName := match.Route.GetName()

}

当我定义路线时,我添加了我的路线.Name("route/:param")在哪里route/:param。


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信