gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:46:00 25 4
gpt4 key购买 nike

问题:无法从中间件访问 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)
}
}

func use(h http.Handler, mw ...func(http.Handler) http.Handler) http.Handler {
// exec order: mw[0],mw[1],mw[N]...
for i := len(mw) - 1; i >= 0; i-- {
h = mw[i](h)
}
return h
}

func mwAuthorize(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if true != authorize(r) {
w.WriteHeader(http.StatusForbidden)
return
} else {
next.ServeHTTP(w, r)
}
})
}

func authorize(r *http.Request) (isAuthorized bool) {
isAuthorized = false
/**
This is where it's failing!
*/
routeName := mux.CurrentRoute(r).GetName()
switch routeName {
case "USERS_CREATE":
// route-specific authorization
break
...
default:
break
}
return
}

更新(美国东部时间 2015 年 1 月 4 日下午 4:49):因此,在删除中间件(或至少注释掉试图读取 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):我能够从中间件函数访问请求(例如:r.URL),但仍然无法访问 mux.Route(例如:mux.CurrentRoute(r))。在仔细查看了多路复用器源之后,我认为这是因为当前的多路复用器上下文没有设置,因为路由器还没有执行匹配器(因此它不知道它当前在什么路由上,直到中间件之后已经完成)。但是,我仍然不确定如何解决这个问题,或者重新构建我的代码来处理这个问题。

最佳答案

关于:

routeName := mux.CurrentRoute(r).GetName()

其中 r*http.Request。不要忘记导入 "github.com/gorilla/mux"。请记住,为了使用它,您必须在定义它时为您的路由命名

关于http - 从中间件获取 gorilla/mux 路由器当前路由名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27768655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com