我正在使用微服务架构来构建应用程序。 在网关上,我确实希望将请求路由到正确的端点。
但是,端点现在在运行时是已知的,需要在数据库中进行配置。
下面是获取路由器的代码。
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")
})
}
但是,永远不会打印“错误”。 仅当我为'/'放置处理程序时才会打印
如何在没有处理程序的情况下创建中间件?
答案 0 :(得分:1)
之所以称为“中间件”,是因为它应该将您的Handler
置于“中间”。它接收Handler
之前的输入,并接收Handler
的输出。
从本质上讲,要使中间件正常工作,您至少需要一个Handler。最好您可以只在处理程序中使用所需的功能,而不是在中间件中使用。
答案 1 :(得分:1)
在中间件上,您需要调用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)
是必需的。