一尘不染

来自处理程序内部的Gorilla Mux路由器仅工作一次,然后显示404页未找到

go

我使用大猩猩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

如您所见,控制台中没有错误。

有人对为什么 它只能工作 一次 有一个想法吗?


阅读 243

收藏
2020-07-02

共1个答案

一尘不染

问题是Subrouter()并不是返回路由器,而是创建一个,因此它会更改被调用的路由器的匹配器,从而使处理程序丢失。

您可以尝试使用闭包将路由器传递给处理程序。

func RootHandler(router *mux.Router) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        ...
    }
}
2020-07-02