没有处理程序的Mux中间件

时间:2018-11-28 19:55:50

标签: go mux

我正在使用微服务架构来构建应用程序。 在网关上,我确实希望将请求路由到正确的端点。

但是,端点现在在运行时是已知的,需要在数据库中进行配置。

下面是获取路由器的代码。

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 个答案:

答案 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)是必需的。