没有处理程序的 Mux 中间件
Mux middleware without handler
我正在使用微服务架构构建应用程序。
在网关上,我确实想将请求路由到正确的端点。
但是,端点现在在运行时已知,需要在数据库中配置。
下面是获取路由器的代码。
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")
})
}
然而,"Error" 从未被打印出来。
它仅在我为 '/'
放置处理程序时打印
如何创建没有处理程序的中间件?
之所以称为 "middleware",是因为它应该将您的 Handler
放在 "middle" 中。它在您的 Handler
之前接收输入,并接收您的 Handler
之前的输出。
本质上,要让您的中间件正常工作,您需要至少有一个处理程序。最好您可以只在处理程序而不是中间件中使用您需要的这个功能。
在中间件上,您需要调用 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)
是强制性的。
我正在使用微服务架构构建应用程序。 在网关上,我确实想将请求路由到正确的端点。
但是,端点现在在运行时已知,需要在数据库中配置。
下面是获取路由器的代码。
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")
})
}
然而,"Error" 从未被打印出来。 它仅在我为 '/'
放置处理程序时打印如何创建没有处理程序的中间件?
之所以称为 "middleware",是因为它应该将您的 Handler
放在 "middle" 中。它在您的 Handler
之前接收输入,并接收您的 Handler
之前的输出。
本质上,要让您的中间件正常工作,您需要至少有一个处理程序。最好您可以只在处理程序而不是中间件中使用您需要的这个功能。
在中间件上,您需要调用 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)
是强制性的。