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

Posted

技术标签:

【中文标题】内部处理程序中的 Gorilla Mux 路由器仅工作一次,然后给出 404 页面未找到【英文标题】:Gorilla Mux router from inside handler only works once then gives 404 page not found 【发布时间】:2014-10-30 12:34:54 【问题描述】:

我使用 Gorilla 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()

这种使用当前请求在处理程序中获取路由器的方法来自另一个 *** 帖子: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

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

有人知道为什么它只工作一次

【问题讨论】:

【参考方案1】:

问题是 Subrouter() 不是用来返回路由器,而是创建一个,因此它改变了它被调用的路由器的匹配器,使你失去了处理程序。

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

func RootHandler(router *mux.Router) func(http.ResponseWriter, *http.Request) 
    return func(w http.ResponseWriter, r *http.Request) 
        ...
    

【讨论】:

没有其他方法可以从处理程序内部访问路由器吗?也许使用 Gorilla context 但它需要一个请求...... 如果你只是想获取被调用路由的 URL,你可以做 rootUrl, err := mux.CurrentRoute(r).URL()

以上是关于内部处理程序中的 Gorilla Mux 路由器仅工作一次,然后给出 404 页面未找到的主要内容,如果未能解决你的问题,请参考以下文章

中间件中的 gorilla/mux 下一个处理程序是 nil

使用 Gorilla MUX 和 Negroni 子路由中间件

小白学标准库之 mux

如何在 Gorilla mux 路由中获取 OR 模式

在 Gorilla Mux 中嵌套子路由器

GolangWeb 入门 08 集成 Gorilla Mux