为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕侠2389804 2022-08-24 18:53:14
我正在尝试将静态站点(和SPA)嵌入到我的Go代码中。我的项目的高级结构是.├── web.go└── spa/    └── index.html我的目的是服侍。http://localhost:8090/index.html要做到这一点的相关代码是//go:embed spavar spa embed.FSlog.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我应该如何设置?
查看完整描述

2 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

嵌入式目录中的文件路径以 //go:embed 指令中使用的路径为前缀。索引.html的嵌入式文件系统路径为 。spa/index.html

创建一个根植于该目录的子文件系统,并为该文件系统提供服务。子文件系统 中的 路径为 。spaindex.htmlindex.html

sub, _ := fs.Sub(spa, "spa")
r.Handle("/", http.FileServer(http.FS(sub)))

https://pkg.go.dev/io/fs#Sub

在操场上运行示例

这种方法适用于任何多路复用器,包括大猩猩多路复用器。这是大猩猩的代码,其中是:r*mux.Router

sub, _ := fs.Sub(spa, "spa")
r.PathPrefix("/").Handler(http.FileServer(http.FS(sub)))

在操场上运行示例


查看完整回答
反对 回复 2022-08-24
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

使用Gorilla Mux,您需要指定路径前缀:


package main


import (

    "embed"

    "fmt"

    "github.com/gorilla/mux"

    "log"

    "net/http"

)


//go:embed spa

var spa embed.FS


func main() {

    log.Println("starting api server")

    r := mux.NewRouter()

    r.PathPrefix("/spa/").Handler(http.StripPrefix("/", http.FileServer(http.FS(spa))))

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

}

这会将请求路由到处理程序。然后,您必须剥离前缀,因为目录的内容具有不带前导符的前缀:<host>/spa/*/spaspa//


    b, _ := spa.ReadFile("spa/index.html")

    fmt.Println(string(b)) // file contents

总结一下:


http://localhost:8090/spa/index.html路由到处理程序。虽然路由是 ,但去掉第一个结果,这最终与嵌入变量中的文件路径匹配。r.PathPrefix("/spa/")/spa/index.html/spa/index.html


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信