为了账号安全,请及时绑定邮箱和手机立即绑定

没有处理程序的 Mux 中间件

没有处理程序的 Mux 中间件

Go
元芳怎么了 2023-05-15 10:08:05
我正在使用微服务架构构建应用程序。在网关上,我确实想将请求路由到正确的端点。但是,端点现在在运行时已知,需要在数据库中进行配置。下面是获取路由器的代码。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 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

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

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


查看完整回答
反对 回复 2023-05-15
?
萧十郎

TA贡献1815条经验 获得超12个赞

在中间件上,您需要调用处理程序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)在您的情况下是强制性的。


查看完整回答
反对 回复 2023-05-15
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信