为了账号安全,请及时绑定邮箱和手机立即绑定

中间件 chi.Use 与 chi.With 的区别

中间件 chi.Use 与 chi.With 的区别

Go
守着星空守着你 2022-12-19 21:40:03
使用 Chi router 设置中间件时chi.Use和之间有什么区别。chi.With
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

Use必须在同一组下的所有路由之前声明,而r.With允许您“内联”中间件。


事实上,函数签名是不同的。Use什么都不返回,With返回一个chi.Router.


假设您有一条路线并且只想向其中之一添加中间件,您可以使用r.With:


r.Route("/myroute", func(r chi.Router) {

    r.Use(someMiddleware) // can declare it here

    r.Get("/bar", handlerBar)

    r.Put("/baz", handlerBaz)

    // r.Use(someMiddleware) // can NOT declare it here

}


r.Route("/other-route", func(r chi.Router) {

    r.Get("/alpha", handlerBar)

    r.Put("/beta", handlerBaz)


    r.With(someMiddleware).Get("/gamma", handlerQuux)

}

在第一个示例中,someMiddleware为所有子路由声明,而在第二个示例中r.With允许您仅为/other-route/gamma路由添加中间件。


查看完整回答
反对 回复 2022-12-19
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

根据chi.Usechi.With的文档。

使用将中间件处理程序附加到 Mux 中间件堆栈。

任何 Mux 的中间件堆栈将在搜索到特定处理程序的匹配路由之前执行,这提供了提前响应、更改请求执行过程或为下一个 http.Handler 设置请求范围值的机会。

With 为端点处理程序添加内联中间件。


查看完整回答
反对 回复 2022-12-19
?
杨魅力

TA贡献1811条经验 获得超6个赞

让我们看看如何chi.Usechi.With例子

用例非常简单,chi.Use注册的中间件将在所有注册到的路由处理程序之前运行Router


r := chi.NewRouter()

r.Use(middleware.Logger)

r.Get("/", func(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("welcome"))

})

http.ListenAndServe(":3000", r)

例如:这里Logger的中间件将在所有注册路由处理程序之前被调用。


而随着chi.With您返回中间件将在其上运行的新路由,因此如果在返回Router的注册中间件上注册了任何路由,则注册的中间件将运行。这里的用例非常具体假设如果你想为一组路由运行特定的中间件或者想要为特定的路由执行一些操作那么你可以使用chi.Use


r.Route("/articles", func(r chi.Router) {

    r.With(paginate).Get("/", listArticles)                           // GET /articles

    r.With(paginate).Get("/{month}-{day}-{year}", listArticlesByDate) // GET /articles/01-16-2017


    r.Post("/", createArticle)                                        // POST /articles

    r.Get("/search", searchArticles)                                  // GET /articles/search


    // Regexp url parameters:

    r.Get("/{articleSlug:[a-z-]+}", getArticleBySlug)                // GET /articles/home-is-toronto


    // Subrouters:

    r.Route("/{articleID}", func(r chi.Router) {

      r.Use(ArticleCtx)

      r.Get("/", getArticle)                                          // GET /articles/123

      r.Put("/", updateArticle)                                       // PUT /articles/123

      r.Delete("/", deleteArticle)                                    // DELETE /articles/123

    })

})

在上面的例子中,paginate中间件只会被所有的文章调用,如果有任何中间件在主路由上注册,那么其他路由/articles/的/{month}-{day}-{year}日间路由将不会被调用。chi.Withchi.Use


查看完整回答
反对 回复 2022-12-19
  • 3 回答
  • 0 关注
  • 249 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信