猿问

在 Gorilla Mux 中嵌套子路由器

我一直在使用gorilla/mux我的路由需求。但是我注意到一个问题,当我嵌套多个子路由器时它不起作用。


这是示例:


func main() {

    r := mux.NewRouter().StrictSlash(true)

    api := r.Path("/api").Subrouter()

    u := api.Path("/user").Subrouter()

    u.Methods("GET").HandleFunc(UserHandler)

    http.ListenAndServe(":8080", r)

}

我想使用这种方法,所以我可以将填充路由器委托给其他一些包,例如 user.Populate(api)


但是,这似乎不起作用。仅当我在链中使用单个子路由器时才有效。


有任何想法吗?


慕标5832272
浏览 269回答 3
3回答

至尊宝的传说

如果您需要分离 UI 和 API 路由器,您可以简单地执行 :appRouter := r.PathPrefix("/").Subrouter()appRouter.Use(myAppRouter)apiRouter := r.PathPrefix("/api").Subrouter()apiRouter.Use(myAPIRouter)

米琪卡哇伊

我想通了,所以我会把它贴在这里,以防有人像我一样愚蠢。:D创建基于路径的子路由器时,您必须使用PathPrefix而不是Path.r.PathPrefix("/api").Subrouter()使用r.Path("/api")仅安装处理器到端点时。

慕容3067478

对于那些在 auth 和 noauth 路由之间挣扎的人来说,以下对我来说很好用:r := mux.NewRouter()noAuthRouter := r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {    return r.Header.Get("Authorization") == ""}).Subrouter()authRouter := r.MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {    return true}).Subrouter()然后你可以只为 authRouter 应用中间件
随时随地看视频慕课网APP

相关分类

Go
我要回答