我正在使用大猩猩多路复用器来管理路由。我所缺少的是在每个请求之间集成中间件。
例如
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) } }
每个传入的请求都应通过中间件。如何在这里集成中间件?
更新资料
我将其与大猩猩/会议结合使用,他们说:
重要说明:如果您不使用大猩猩/多核,则需要使用context.ClearHandler包装处理程序,否则会泄漏内存!一种简单的方法是在调用http.ListenAndServe时包装顶级mux:
如何防止这种情况?
只需创建一个包装器,在Go中就很容易了:
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)) }