第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

中間件如何在 Go 中的 chi 路由中工作,以及 http 的作用是什么。處理程序參數(shù)是指中間件?

中間件如何在 Go 中的 chi 路由中工作,以及 http 的作用是什么。處理程序參數(shù)是指中間件?

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它指的是我們的多路復用器路由器嗎?另外,當我在函數(shù)寫到控制臺的行下注釋時,html沒有呈現(xiàn)或任何東西?有人可以解釋一下接下來指的是什么,什么?next.ServeHTTPhttp.Handlernext.serveHTTP
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

next是“處理程序鏈”中的下一個處理程序。


當您執(zhí)行以下操作時:


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)))

中間件函數(shù)返回的每個處理程序都必須調用提供給它的處理程序,即 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()

    }

}

通過上述操作,您可以執(zhí)行以下操作:


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 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號