使用 Gorilla MUX 和 Negroni 子路由中间件

Posted

技术标签:

【中文标题】使用 Gorilla MUX 和 Negroni 子路由中间件【英文标题】:Subroutes middlewares with Gorilla MUX and Negroni 【发布时间】:2017-06-21 19:31:49 【问题描述】:

我正在尝试仅在某些路由上添加中间件。我写了这段代码:

func main() 
  router := mux.NewRouter().StrictSlash(false)

  admin_subrouter := router.PathPrefix("/admin").Subrouter()

  //handlers.CombinedLoggingHandler comes from gorilla/handlers
  router.PathPrefix("/admin").Handler(negroni.New(
    negroni.Wrap(handlers.CombinedLoggingHandler(os.Stdout, admin_subrouter)),
  ))

  admin_subrouter.HandleFunc("/articles/new", articles_new).Methods("GET")
  admin_subrouter.HandleFunc("/articles", articles_index).Methods("GET")
  admin_subrouter.HandleFunc("/articles", articles_create).Methods("POST")

  n := negroni.New()
  n.UseHandler(router)
  http.ListenAndServe(":3000", n)

我希望只看到前缀为 /admin 的路径的请求日志。我在执行“GET /admin”时确实看到了一条日志行,但在执行“GET /admin/articles/new”时却没有。我通过蛮力尝试了其他组合,但我无法得到它。我的代码有什么问题?

我看到了其他方法,比如在每个路由定义上包装 HandlerFunc,但我想为前缀或子路由器做一次。

我在那里使用的日志记录中间件用于测试,也许 Auth 中间件更有意义,但我只是想让它工作。

谢谢!

【问题讨论】:

【参考方案1】:

问题是您创建子路由/admin 的方式。完整的参考代码在这里https://play.golang.org/p/zb_79oHJed

// Admin
adminBase := mux.NewRouter()
router.PathPrefix("/admin").Handler(negroni.New(
    // This logger only applicable to /admin routes
    negroni.HandlerFunc(justTestLogger),
    // add your handlers here which is only appilcable to `/admin` routes
    negroni.Wrap(adminBase),
))

adminRoutes := adminBase.PathPrefix("/admin").Subrouter()
adminRoutes.HandleFunc("/articles/new", articleNewHandler).Methods("GET")

现在,访问这些 URL。您只会看到 /admin 子路由的日志。

【讨论】:

这行得通,谢谢。我想使用 Gorilla 包处理程序提供的中间件。 然后,我可以使用 Gorilla 处理程序做:router.PathPrefix("/admin").Handler(negroni.New( negroni.Wrap(handlers.CombinedLoggingHandler(os.Stdout, adminBase)), )) 是的,您可以使用它,只是为了演示子路由器的定义,我在示例中没有使用它。对此感到抱歉。 使用子路由器上的确切代码作为基础。处理程序函数没有被调用。

以上是关于使用 Gorilla MUX 和 Negroni 子路由中间件的主要内容,如果未能解决你的问题,请参考以下文章

GolangWeb 入门 08 集成 Gorilla Mux

GolangWeb 入门 08 集成 Gorilla Mux

Gorilla Mux 和 GORM 失败

使用 Gorilla Mux 和 CockroachDB 编写可维护 RESTful API

使用httputil和gorilla / mux反向代理

Gorilla mux 可选查询值