gpt4 book ai didi

转到1.16 : how to use strip prefix in go:embed

转载 作者:行者123 更新时间:2023-12-03 10:06:29 25 4
gpt4 key购买 nike

我有一个使用VueJS提供Web界面的go项目。在构建项目时,我首先使用npm run build编译前端代码,该前端代码是在我的项目目录的gui/dist下生成的。然后,我使用以下代码来提供静态内容:

//go:embed gui/dist/*
var dist embed.FS

gui := http.FileServer(http.FS(dist))
http.Handle("/", gui)
http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
msg := fmt.Sprintf("TODO: %s", r.URL)
http.Error(w, msg, http.StatusNotImplemented)
})

svr := http.Server{
Addr: fmt.Sprintf(":%v", cf.HTTPPort),
ReadTimeout: time.Minute,
WriteTimeout: time.Minute,
}
assert(svr.ListenAndServe())
问题是,当在浏览器中打开站点时,它显示了一个浏览文件界面,即从gui开始,然后进入dist,然后显示了 index.html文件,该文件为空白页,因为它需要诸如 /css/...之类的文件,而Go Web服务器通过 /gui/dist/css/...提供服务。
我尝试使用 http.StripPrefix(),但显然不打算处理这种情况,或者我没有正确使用它:
http.Handle("/", http.StripPrefix("/gui/dist", gui))
生成了 404 page not found

最佳答案

您可以使用fs.Sub(dist, "gui/dist"),尝试一下:

package main

import (
"embed"
"fmt"
"io/fs"
"log"
"net/http"
)

func main() {
http.Handle("/", http.FileServer(getFileSystem()))
http.HandleFunc("/api/", api)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err)
}
}

func getFileSystem() http.FileSystem {
fsys, err := fs.Sub(dist, "gui/dist")
if err != nil {
log.Fatal(err)
}
return http.FS(fsys)
}
func api(w http.ResponseWriter, r *http.Request) {
msg := fmt.Sprintf("TODO: %s", r.URL)
http.Error(w, msg, http.StatusNotImplemented)
}

//go:embed gui/dist/*
var dist embed.FS

关于转到1.16 : how to use strip prefix in go:embed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66274816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com