Go和Gorilla Mux不工作

Go和Gorilla Mux不工作,go,mux,gorilla,Go,Mux,Gorilla,我就是没办法让这辆车开动。我希望在每个get请求上提供一个静态文件,假设它存在,否则就提供index.html。这是我目前简化的路由器: func fooHandler() http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Foo")) } return http.HandlerFunc(fn) } func notFound(w http.Response

我就是没办法让这辆车开动。我希望在每个get请求上提供一个静态文件,假设它存在,否则就提供index.html。这是我目前简化的路由器:

func fooHandler() http.Handler {
  fn := func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Foo"))
  }
  return http.HandlerFunc(fn)
}

func notFound(w http.ResponseWriter, r *http.Request) {
  http.ServeFile(w, r, "public/index.html")
}

func main() {
  router = mux.NewRouter()
  fs := http.FileServer(http.Dir("public"))

  router.Handle("/foo", fooHandler())
  router.PathPrefix("/").Handler(fs)
  router.NotFoundHandler = http.HandlerFunc(notFound)

  http.ListenAndServe(":3000", router)
}
/福工作正常

/存在的文件工作正常

/不存在的文件不起作用 -我得到404页未找到,而不是index.html


那么我在这里做错了什么呢?

问题是
路由器.PathPrefix(“/”).Handler(fs)
将匹配每个路由,而
NotFoundHandler
永远不会执行。 只有当路由器找不到匹配的路由时,才会执行
NotFoundHandler

当您明确定义路由时,它将按预期工作

你可以这样做:

router.Handle("/foo", fooHandler())
router.PathPrefix("/assets").Handler(fs)
router.HandleFunc("/", index)
router.HandleFunc("/about", about)
router.HandleFunc("/contact", contact)
router.NotFoundHandler = http.HandlerFunc(notFound)
这对我很有效

r.NotFoundHandler = http.HandlerFunc(NotFound)
确保“NotFound”函数具有:

func NotFound(w http.ResponseWriter, r *http.Request) { // a * before http.Request

如果请求没有到达任何处理程序,而我们得到的响应是错误的请求,该怎么办?是否有测试该场景的方法?