gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:16:42 24 4
gpt4 key购买 nike

我正在使用 Gorilla mux 作为我的路由器,但我有一个非常奇怪的行为。在对服务器的第一个请求中,我得到了一个有效的响应。但在后续请求中,我收到了 404 页面未找到。控制台没有错误。

我的代码非常简单(可以复制粘贴来直接测试):

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()

这种使用当前请求在处理程序中获取路由器的方法来自另一个 StackOverflow 帖子:How to call a route by its name from inside a handler?

但是由于一个奇怪的原因,它只能工作一次:

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) {
...
}
}

关于来自内部处理程序的 Gorilla Mux 路由器仅工作一次然后给出 404 页面未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26653152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com