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

中间件如何在 Go 中的 chi 路由中工作,以及 http 的作用是什么。处理程序参数是指中间件?

中间件如何在 Go 中的 chi 路由中工作,以及 http 的作用是什么。处理程序参数是指中间件?

Go
潇潇雨雨 2022-09-19 14:49:33
-- routes.go --package mainimport (    "hotelsystem/pkg/config"    "hotelsystem/pkg/handlers"    "net/http"    "github.com/go-chi/chi/v5"    "github.com/go-chi/chi/v5/middleware")func routes(app *config.AppConfig) http.Handler {    mux := chi.NewRouter()    mux.Use(middleware.Recoverer)    mux.Use(WriteToConsole)    mux.Get("/", handlers.Repo.Home)    mux.Get("/about", handlers.Repo.About)    return mux}-- middleware.go --package mainimport (    "fmt"    "net/http")func WriteToConsole(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        fmt.Println("Hit the page")        next.ServeHTTP(w, r)    })}-- main.go --package mainimport (    "hotelsystem/pkg/config"    "hotelsystem/pkg/handlers"    "hotelsystem/pkg/render"    "log"    "net/http")const portNumber = ":3000"func main() {    var app config.AppConfig    tc, err := render.CreateTemplateCache()    if err != nil {        log.Fatal("Can't create templatecache", err)    }    app.TemplateCache = tc    app.UseCache = false    repo := handlers.NewRepo(&app)    handlers.NewHandlers(repo)    render.NewTemplate(&app)    // http.HandleFunc("/", handlers.Repo.Home)    // http.HandleFunc("/about", handlers.Repo.About)    // http.ListenAndServe(portNumber, nil)    srv := &http.Server{        Addr:    portNumber,        Handler: routes(&app),    }    err = srv.ListenAndServe()    if err != nil {        log.Fatal(err)    }}我很难理解中间件。我正在使用 chi 进行路由。我不明白的是,(下一个)论点指的是什么?http.HandlerWriteToConsole它指的是我们的多路复用器路由器吗?另外,当我在函数写到控制台的行下注释时,html没有呈现或任何东西?有人可以解释一下接下来指的是什么,什么?next.ServeHTTPhttp.Handlernext.serveHTTP
查看完整描述

1 回答

?
米琪卡哇伊

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

next是“处理程序链”中的下一个处理程序。


当您执行以下操作时:


mux.Use(middleware.Recoverer)

mux.Use(WriteToConsole)

mux.Get("/", handlers.Repo.Home)

mux.Get("/about", handlers.Repo.About)

您实际上是在注册两个“处理程序链”:


mux.Get("/", middleware.Recoverer(WriteToConsole(handlers.Repo.Home)))

mux.Get("/about", middleware.Recoverer(WriteToConsole(handlers.Repo.About)))

中间件函数返回的每个处理程序都必须调用提供给它的处理程序,即 do ,如果它不调用,则链被破坏,该链中的其余处理程序将被忽略。nextnext.ServeHTTP(w, r)next


一个简化的代码示例可以更好地说明链接:


type handler func()


// your handler

func f() { fmt.Println("f") }


// one middleware

func g(next handler) handler {

    return func() {

        fmt.Print("g.")

        next()

    }

}


// another middleware

func h(next handler) handler {

    return func() {

        fmt.Print("h.")

        next()

    }

}

通过上述操作,您可以执行以下操作:


func main() {

    h1 := h(g(f))

    h1()


    h2 := g(h(f))

    h2()


    // And you can chain as many of these as you like

    // and in any order you like.

    h3 := h(g(h(h(h(g(g(h(f))))))))

    h3()

}

https://play.golang.org/p/4NXquYsaljr


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号