亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

沒有處理程序的 Mux 中間件

沒有處理程序的 Mux 中間件

Go
元芳怎么了 2023-05-15 10:08:05
我正在使用微服務架構構建應用程序。在網關上,我確實想將請求路由到正確的端點。但是,端點現在在運行時已知,需要在數據庫中進行配置。下面是獲取路由器的代碼。func getRouter() *mux.Router {    r := mux.NewRouter()    r.Use(dynamicRouteMiddleware)    return r}中間件本身是這樣的:func dynamicRouteMiddleware(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        fmt.Println("Error")    })}但是,永遠不會打印“錯誤”。僅當我為“/”放置處理程序時才會打印如何創建沒有處理程序的中間件?
查看完整描述

2 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

它被稱為“中間件”,因為它應該把你Handler放在“中間”。它在您的之前接收輸入Handler,并接收您的輸出Handler。

本質上,要讓你的中間件工作,你需要至少有一個處理程序。最好你可以只使用你在處理程序而不是中間件中需要的這個功能。


查看完整回答
反對 回復 2023-05-15
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

在中間件上,您需要調用處理程序next,以便所有傳入請求都將繼續到目標路由。


func dynamicRouteMiddleware(next http.Handler) http.Handler {

    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        fmt.Println("Error")

        next.ServeHTTP(w, r) // <------- this one

    })

}

您可以根據需要注冊任何路由,但最后要確保該r對象用作/路由的處理程序。


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

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

})


r.HandleFunc("/test/12", func(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("test 12"))

})


r.HandleFunc("/about-us", func(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("about us"))

})


http.Handle("/", r)

http.ListenAndServe(":8080", nil)

當您訪問/test, /test/12, 或/about-us; 仍將Error打印。


以前它不會打印,因為您不會繼續執行下一個處理程序。該代碼next.ServeHTTP(w, r)在您的情況下是強制性的。


查看完整回答
反對 回復 2023-05-15
  • 2 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號