猿问

索引.html在嵌入式目录中的位置?

我正在尝试将静态站点(和SPA)嵌入到我的Go代码中。我的项目的高级结构是


.

├── web.go

└── spa/

    └── index.html

我的目的是服侍。http://localhost:8090/index.html


要做到这一点的相关代码是


//go:embed spa

var spa embed.FS


log.Info("starting api server")

r := mux.NewRouter()

r.Handle("/", http.FileServer(http.FS(spa)))

log.Fatal(http.ListenAndServe(":8090", r))

访问时,我得到http://localhost:8090/


具有单个链接的目录列表页面spa

点击此链接后,我得到一个404 page not found

我应该如何设置?


慕侠2389804
浏览 86回答 2
2回答

慕妹3146593

嵌入式目录中的文件路径以 //go:embed 指令中使用的路径为前缀。索引.html的嵌入式文件系统路径为 。spa/index.html创建一个根植于该目录的子文件系统,并为该文件系统提供服务。子文件系统 中的 路径为 。spaindex.htmlindex.htmlsub, _ := fs.Sub(spa, "spa") r.Handle("/", http.FileServer(http.FS(sub)))https://pkg.go.dev/io/fs#Sub在操场上运行示例。这种方法适用于任何多路复用器,包括大猩猩多路复用器。这是大猩猩的代码,其中是:r*mux.Routersub, _ := fs.Sub(spa, "spa") r.PathPrefix("/").Handler(http.FileServer(http.FS(sub)))在操场上运行示例

蛊毒传说

使用Gorilla Mux,您需要指定路径前缀:package mainimport (&nbsp; &nbsp; "embed"&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "github.com/gorilla/mux"&nbsp; &nbsp; "log"&nbsp; &nbsp; "net/http")//go:embed spavar spa embed.FSfunc main() {&nbsp; &nbsp; log.Println("starting api server")&nbsp; &nbsp; r := mux.NewRouter()&nbsp; &nbsp; r.PathPrefix("/spa/").Handler(http.StripPrefix("/", http.FileServer(http.FS(spa))))&nbsp; &nbsp; log.Fatal(http.ListenAndServe(":8090", r))}这会将请求路由到处理程序。然后,您必须剥离前缀,因为目录的内容具有不带前导符的前缀:<host>/spa/*/spaspa//&nbsp; &nbsp; b, _ := spa.ReadFile("spa/index.html")&nbsp; &nbsp; fmt.Println(string(b)) // file contents总结一下:http://localhost:8090/spa/index.html路由到处理程序。虽然路由是 ,但去掉第一个结果,这最终与嵌入变量中的文件路径匹配。r.PathPrefix("/spa/")/spa/index.html/spa/index.html
随时随地看视频慕课网APP

相关分类

Go
我要回答