你如何使用 chi 路由器提供静态文件

时间:2021-01-25 06:46:12

标签: go

我刚开始在较小的项目中使用 chi,我很好奇这里是如何处理静态文件服务的。完成它的最短方法是什么?

这是我尝试的文件服务

fs := http.FileServer(http.Dir("static"))
router.Handle("/static", http.StripPrefix("/static/", fs))

然而,这不起作用,所以我直接从他们的仓库中尝试了这个例子:

func fileServer(r chi.Router, serverRoute string, pathToStaticFolder http.FileSystem) {
    if strings.ContainsAny(serverRoute, "{}*") {
        panic("FileServer does not permit any URL parameters.")
    }

    if serverRoute != "/" && serverRoute[len(serverRoute)-1] != '/' {
        r.Get(serverRoute, http.RedirectHandler(serverRoute+"/", 301).ServeHTTP)
        serverRoute += "/"
    }
    serverRoute += "*"

    r.Get(serverRoute, func(w http.ResponseWriter, r *http.Request) {
        rctx := chi.RouteContext(r.Context())
        serverRoutePrefix := strings.TrimSuffix(rctx.RoutePattern(), "/*")
        fs := http.StripPrefix(serverRoutePrefix, http.FileServer(pathToStaticFolder))
        fs.ServeHTTP(w, r)
    })
}

dir, _ := os.Getwd()
filesDir := http.Dir(filepath.Join(dir, "static"))
fileServer(router, "/", filesDir)

不幸的是,这两种方法都不起作用,我目前不知所措。任何曾经使用 Chi 作为路由器的人,你如何提供静态文件?

这是我的文件夹结构

project
  |_ main.go
  |_ static
      |_css
         |_index.css
      |_img
      |_js

1 个答案:

答案 0 :(得分:5)

您应该修改路由器中注册的路径为

router.Handle("/static/*", http.StripPrefix("/static/", fs))

* 代表不同的文件名。