首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大猩猩Mux路由器从内部处理程序只工作一次,然后给404页找不到。

大猩猩Mux路由器从内部处理程序只工作一次,然后给404页找不到。
EN

Stack Overflow用户
提问于 2014-10-30 12:34:54
回答 2查看 1.5K关注 0票数 2

我使用大猩猩mux作为我的路由器,我有一个非常奇怪的行为。在对服务器的第一个请求中,我会得到一个有效的响应。但是在随后的请求中,我会收到一个404 page not found。控制台中没有错误。

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

代码语言:javascript
复制
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)
}

经过一些代码注释和测试,下面一行似乎是罪魁祸首:

代码语言:javascript
复制
rootUrl, err := mux.CurrentRoute(r).Subrouter().Get("root").URL()

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

但出于一个奇怪的原因,它只起了一次作用:

代码语言:javascript
复制
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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-30 14:07:57

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

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

代码语言:javascript
复制
func RootHandler(router *mux.Router) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        ...
    }
}
票数 2
EN

Stack Overflow用户

发布于 2022-12-04 03:51:27

我解决了这个问题,并通过重新启动方法来解决它。

代码语言:javascript
复制
//create a subrouter separately \
subRoute := mux.CurrentRoute(req).Subrouter() \
//Call the Route u want and store the URL 
url, err := subRoute.Get("check_authorization").URL("id", key, "password", token) 
// re-initiate the method to GET or whatever u had before 
subRoute.Methods(http.MethodGet) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26653152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档