【问题标题】:Gorilla mux remove or replace existing routesGorilla mux 删除或替换现有路由
【发布时间】:2020-06-01 10:52:48
【问题描述】:

我正在学习 Go 并遇到了 gorilla/mux 路由器。我想在文本文件中包含动态路由,例如:

/user/1

/post/1

我为此编写了以下代码:

func (s *Server) RegRoutes(routes []Route) {
    for _, r := range routes {
        func(route Route) {
            s.Router.HandleFunc(route.Path, func(w http.ResponseWriter, r *http.Request) {    
                w.Header().Add("Content-Type", "application/json")
                s.sendJson(w, route) // send response to client
            }).Methods(route.Method)
        }(r)
    }
}

一切正常。但我想编辑文本文件并添加更多字段或编辑现有字段而不重建项目或重新启动服务器。我找到了this,但我不明白它是什么,我不知道如何使用它。

是否有在运行时修改现有路由或添加更多路由?

编辑:

我添加了这个:

s.Router.HandleFunc("/reload", func(w http.ResponseWriter, r *http.Request) {

        s.mu.Lock()
        s.Router = mux.NewRouter()
        s.mu.Unlock()

        // load text file and register new routes here
        ....


        s.Router.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
            tpl, err1 := route.GetPathTemplate()
            met, err2 := route.GetMethods()
            fmt.Println(tpl, err1, met, err2)
            return nil
        })
        fmt.Fprintf(w, "RELOAD")
    })

当我在注册新路线并替换 Router 后打印路线时,它们已注册,但当我在浏览器中浏览路线时,出现 404 错误。

【问题讨论】:

    标签: go server routes gorilla mux


    【解决方案1】:

    如果我理解你想要达到的目标,它会是这样的:

    package main
    
    import (
        "fmt"
        "github.com/gorilla/mux"
        "net/http"
    )
    
    var router = mux.NewRouter()
    func handler(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("bla"))
    }
    
    func reloadHandler(w http.ResponseWriter, r *http.Request) {
        router.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
            t, err := route.GetPathTemplate()
            if err != nil {
                return err
            }
            fmt.Println(t)
            if t == "/" {
                route.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
                    writer.Write([]byte("akjbsdkabdjkbaksdj"))
                })
            }
            return nil
        })
    }
    
    func main() {
    
        router.HandleFunc("/", handler)
        router.HandleFunc("/reload", reloadHandler)
    
        http.ListenAndServe("localhost:8080", router)
    }
    
    

    路由器声明在main function之外,它可以被重载处理程序访问以添加另一个路由。

    和path walk你可以检查是否是你要改变的路径,然后改变它。

    【讨论】:

    • 感谢您的回复,但这不是我的问题。我想在运行时添加或删除路由,而不需要重新启动服务器。
    • 我做了一个更新,你可以更新一个路由来改变它的HandleFunc。之前的代码是添加路线。两者都无需重新启动服务器。
    • 很遗憾,这仍然不是我的答案。
    • 你是什么意思:Is there anyway to modify the existing routes or add more routes during the run-time?