問題: 無法從中間件訪問 mux.CurrentRoute(r).GetName()。(雖然我已經(jīng)能夠從我的中間件訪問它,但由于它以前無法訪問請求,我不得不改變我的中間件的工作方式)。所以我搞砸了一些事情,但我不確定如何回到可以訪問路線名稱的工作狀態(tài)。任何幫助將非常感激!錯誤: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 的部分)后,我能夠從目標(biāo) handlerfunc 中檢索路由名稱(例如: usersCreateHandlerFunc 或brandsCreateHandlerFunc)。這并沒有解決我的問題(我仍然想在中間件中執(zhí)行身份驗證/授權(quán)而不是每個 handlerfunc),我有一種預(yù)感,它讓我知道 *mux.Router 在我的中間件中不可用,直到最終完成.ServeHTTP 調(diào)用。(或類似的規(guī)定...)更新 (2015-01-04 @ 5:41PM EST):嘗試使用 Negroni 作為中間件組件的不同(盡管不太受歡迎)的方向。當(dāng)我嘗試獲取 mux.CurrentRoute 時仍然出現(xiàn) nil-pointer 錯誤。更新 (2015-01-04 @ 6:17PM EST):我可以從中間件 func 訪問請求(例如:r.URL),但仍然無法訪問 mux.Route(例如:mux.CurrentRoute( r))。在查看了多路復(fù)用源之后,我認(rèn)為這是因為當(dāng)前的多路復(fù)用上下文沒有被設(shè)置,因為路由器還沒有執(zhí)行匹配器(因此它不知道它當(dāng)前在什么路由上,直到中間件之后已完成)。但是,我仍然不確定如何解決這個問題,或者重新構(gòu)建我的代碼來處理這個問題。
3 回答

叮當(dāng)貓咪
TA貢獻(xiàn)1776條經(jīng)驗 獲得超12個贊
我遇到了同樣的問題,我以這種方式解決了:
var match mux.RouteMatch
routeExists := s.Router.Match(r, &match)
if routeExists && match.Route.GetName(){
routeName := match.Route.GetName()
}
當(dāng)我定義路線時,我添加了我的路線.Name("route/:param")在哪里route/:param。
- 3 回答
- 0 關(guān)注
- 222 瀏覽
添加回答
舉報
0/150
提交
取消