没有处理程序的 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) 是强制性的。