当前位置: 首页 > 面试题库 >

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

林烨华
2023-03-14
问题内容

我使用大猩猩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) {
        ...
    }
}


 类似资料:
  • 我使用的反应路由器dom版本5.0.1一个简单的反应应用程序,我使用了汇总捆绑,这是我的路由器组件 问题是,它只在localhost:8000/处显示主路由,但当我尝试访问localhost:8000/hello或localhost:8000/登录时,会出现此错误 这是我的rollup.config };

  • 问题内容: 我有一个带有服务的应用程序,该服务包装了我的API调用: 并且我正在使用UI-Router在状态之间进行转换: 我不再使用普通的AngularJS路由器,并且难以理解如何实现404。我可以看到抛出状态被拒绝,但是如何在状态路由器中捕获它呢? 问题答案: 仅当没有其他 路由 匹配时才调用该规则。您真正想要的是拦截事件,即在状态转换中出现问题(例如,解析失败)时触发的事件。您可以在状态更改

  • 问题内容: 我做了一些Angular路线,如下面的代码所示。 在我将基本href设置为“ /”后,它可以正常工作,但它接受了带有“ / portfolio”的href的锚点,但是当我转到“ http://url.com/portfiolo ”或尝试重新加载页面时当我在投资组合路线上时,它将给我服务器错误。我可以为此做些什么吗? 提前致谢。 问题答案: 我自己解决了..您始终需要在项目的根目录中创建

  • 我有一个组件,它采用与标准react路由器类似的道具,并返回路由。此返回路线有一个渲染道具,该道具仅通过组件,但添加了导航组件。此自定义不适用于react router组件,因为当我在交换机内使用自定义组件以及catch all 404页面时,该页面始终显示。 如何使404组件只显示如果没有其他路由匹配的url? 导航路线 用法 编辑:完整示例的Codesandbox: codesandobx的h

  • 我使用React路由器的SPA,但我不确定如何显示索引路由"/"上的一些内容。 我的顶级路由器配置只是: 顶层组件呈现页眉/页脚和其他公共元素: 子路由工作正常,它们在应用程序组件中呈现。但是,如何在根路径上呈现某些内容,使其不只是一个空白页面?

  • 问题内容: 如何从处理程序内部正确引用路由名称? 应该全局分配而不是放在函数内部? 问题答案: 您具有返回给定请求的路由的方法。根据该请求,您可以创建一个子路由器并调用 示例:(播放:http : //play.golang.org/p/Lz10YUyP6e)