16

我一直在使用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)

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

有任何想法吗?

4

3 回答 3

29

我想通了,所以我就把它贴在这里,以防有人像我一样愚蠢。:D

创建基于路径的子路由器时,您必须使用PathPrefix而不是Path.

r.PathPrefix("/api").Subrouter()

r.Path("/api")仅在将处理程序附加到该端点时使用。

于 2015-04-11T12:53:12.530 回答
1

对于那些努力在 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 应用中间件

于 2021-01-22T14:40:30.310 回答
0

如果您需要分离 UI 和 API 路由器,您可以简单地按照 OP 的建议进行操作:

appRouter := r.PathPrefix("/").Subrouter()
appRouter.Use(myAppRouter)
apiRouter := r.PathPrefix("/api").Subrouter()
apiRouter.Use(myAPIRouter)

非常感谢OP提供答案。希望为我的用例将所有内容集中在一个地方会对某人有所帮助。

于 2020-03-30T23:40:21.967 回答