我使用大猩猩mux作为路由器,并且行为异常。在对服务器的第一个请求上,我得到一个有效的响应。但是,在随后的请求下,我收到404 page not found。控制台中没有错误。
mux
404 page not found
我的代码非常简单(可以复制粘贴以立即对其进行测试):
package main import ( "fmt" "github.com/gorilla/mux" "log" "net/http" ) func main() { router := mux.NewRouter() router.HandleFunc("/", RootHandler).Name("root") http.Handle("/", router) log.Println("Listening on port 1337...") if err := http.ListenAndServe(":1337", nil); err != nil { log.Fatal("http.ListenAndServe: ", err) } } func RootHandler(w http.ResponseWriter, r *http.Request) { content := "Welcome to " rootUrl, err := mux.CurrentRoute(r).Subrouter().Get("root").URL() if err != nil { log.Printf("mux.CurrentRoute(r).Subrouter().Get(\"root\").URL(): ", err) } response := content + rootUrl.String() fmt.Fprintf(w, response) }
经过一些代码注释和测试,似乎是造成这一问题的原因:
rootUrl, err := mux.CurrentRoute(r).Subrouter().Get("root").URL()
但是出于一个奇怪的原因,它只能运行一次:
shell-1$ go run servertest.go 2014/10/30 13:31:34 Listening on port 1337... shell-2$ curl http://127.0.0.1:1337 Welcome to / shell-2$ curl http://127.0.0.1:1337 404 page not found
如您所见,控制台中没有错误。
有人对为什么 它只能工作 一次 有一个想法吗?
问题是Subrouter()并不是返回路由器,而是创建一个,因此它会更改被调用的路由器的匹配器,从而使处理程序丢失。
您可以尝试使用闭包将路由器传递给处理程序。
func RootHandler(router *mux.Router) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, r *http.Request) { ... } }