2014-10-05 80 views
20

我正在使用大猩猩多路複用器進行管理路由。我所缺少的是在每個請求之間集成一箇中間件。大猩猩多路複用器定製中間件

例如

package main 

import (
    "fmt" 
    "github.com/gorilla/mux" 
    "log" 
    "net/http" 
    "strconv" 
) 

func HomeHandler(response http.ResponseWriter, request *http.Request) { 

    fmt.Fprintf(response, "Hello home") 
} 

func main() { 

    port := 3000 
    portstring := strconv.Itoa(port) 

    r := mux.NewRouter() 
    r.HandleFunc("/", HomeHandler) 
    http.Handle("/", r) 

    log.Print("Listening on port " + portstring + " ... ") 
    err := http.ListenAndServe(":"+portstring, nil) 
    if err != nil { 
     log.Fatal("ListenAndServe error: ", err) 
    } 
} 

每個傳入請求應該穿過中間件。我怎樣才能在這裏整合一個midleware?

更新

我會用它與大猩猩/會話組合,他們說:

重要提示:如果您使用的不是大猩猩/多路複用器,你需要用你的 與context.ClearHandler作爲處理程序,否則你會泄漏內存!一個 簡單的方法來做到這一點是包裝頂級MUX調用 http.ListenAndServe時:

我怎樣才能避免這種情況?

+0

對於那些降落在這裏的人:'gorilla/mux'現在已經內置了中間件處理:https://github.com/gorilla/mux#middleware – kaustavdm 2018-03-03 12:41:21

回答

47

只需創建一個包裝,這是相當容易去:

func HomeHandler(response http.ResponseWriter, request *http.Request) { 

    fmt.Fprintf(response, "Hello home") 
} 

func Middleware(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     log.Println("middleware", r.URL) 
     h.ServeHTTP(w, r) 
    }) 
} 
func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/", HomeHandler) 
    http.Handle("/", Middleware(r)) 
} 
+2

感謝你,'h.ServeHTTP(w,r)'這部分是我所缺少的。他們沒有說清楚如何直接調用Handler。 – tkiethanom 2016-12-13 18:32:03

1

你可能會考慮一箇中間件包,如negroni

+0

當我使用大猩猩/會話時,它不會發生內存泄漏? – 2014-10-05 17:01:58

3

我不知道爲什麼@OneOfOne選擇鏈路由器到中間件,我認爲這是輕微的更好的方法:

func main() { 
    r.Handle("/",Middleware(http.HandlerFunc(homeHandler))) 
    http.Handle("/", r) 
} 

func Middleware(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
    h.ServeHTTP(w, r) 
})} 
+0

這種方法正是我正在尋找的 - 與中間件嵌套的'Handle'。謝謝! – 2017-03-11 16:05:38

1

如果你想中間件鏈應用到路由器的所有路由或subrouter可以使用大猩猩MUX的叉https://github.com/bezrukovspb/mux

subRouter := router.PathPrefix("/use-a-b").Subrouter().Use(middlewareA, middlewareB) 
subRouter.Path("/hello").HandlerFunc(requestHandlerFunc) 
+0

謝謝兄弟!這express.js中間件風格正是我正在尋找 – nxrd 2017-04-05 11:18:15

+0

中間件使用內置現在在大猩猩多路複用器 – ozy 2018-02-18 21:16:19

相關問題