没有处理程序的 Mux 中间件

Posted

技术标签:

【中文标题】没有处理程序的 Mux 中间件【英文标题】:Mux middleware without handler 【发布时间】:2018-11-28 19:55:50 【问题描述】:

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

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

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

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")
    )

但是,永远不会打印“错误”。 只有当我为 '/' 放置处理程序时才会打印它

如何在没有处理程序的情况下创建中间件?

【问题讨论】:

为什么需要没有处理程序的中间件?我认为您混淆了这些术语,听起来您希望它本身是一个处理程序而不是中间件。 这似乎是一个很好的评论 :-) 如果您将其设置为答案,我可以接受。 您能描述一下dynamicRouteMiddleware 的用途[而不是抽象的例子] - 吗?如果您尚未添加到您的 *mux.Router 的路由,则不会匹配任何内容,并且不会在没有匹配的情况下调用中间件。 【参考方案1】:

它被称为“中间件”,因为它应该把你的Handler 放在“中间”。它在您的Handler 之前接收输入,并接收您的Handler 的输出。

本质上,要让你的中间件工作,你需要至少有一个处理程序。最好你可以只在 Handler 中使用你需要的这个功能,而不是中间件。

【讨论】:

【参考方案2】:

在中间件上,您需要调用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) 是强制性的。

【讨论】:

以上是关于没有处理程序的 Mux 中间件的主要内容,如果未能解决你的问题,请参考以下文章

Go Mux 中间件不使用我的 CORS 处理程序

Gorilla mux 自定义中间件

使用 Gorilla MUX 和 Negroni 子路由中间件

Gorilla mux,静态文件服务器的中间件

Go 每日一库之 gorilla/handlers

go -mux,为啥路由没有解析?