登录
首页 >  Golang >  Go问答

没有处理程序的 Mux 中间件

来源:stackoverflow

时间:2024-04-22 14:21:36 439浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《没有处理程序的 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")
    })
}

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

如何创建没有处理程序的中间件?


解决方案


它被称为“中间件”,因为它应该把你的 handler 放在“中间”。它在 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) 是必需的。

今天关于《没有处理程序的 Mux 中间件》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>