gpt4 book ai didi

使用 Angular.js 使用 Gorilla Mux 路由

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:59 25 4
gpt4 key购买 nike

我似乎无法获得正确的路由。我正在使用 Gorilla Mux,我正在尝试从除以“/foo”开头的任何 url 提供我的角度应用程序,所以基本上是我的 index.html。

这个有效:

func StaticFileServer(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, config.dir)
}

func main() {

fs := http.Dir(config.dir)
fileHandler := http.FileServer(fs)

router = mux.NewRouter()

router.Handle("/foo/page", PublicHandler(handler(getAll)).Methods("GET")
router.Handle("/foo/page/{id}", PublicHandler(handler(getOne)).Methods("GET")

router.PathPrefix("/{blaah}/{blaah}/").Handler(fileHandler)
router.PathPrefix("/").HandlerFunc(StaticFileServer)

...
}

但是肯定有比显式声明每条可能的路径更简单的方法,比如 PathPrefix("/{blaah}/{blaah}/") 这样的东西......对于这个,除了/{blaah}/{blaah}/之外的任何其他 url 都会返回一个 404 页面未找到,而不是 index.html。

因此,只要可以找到,我就希望提供所有服务(静态文件等),但其他所有内容都应返回/public/index.html。

最佳答案

我也面临同样的问题,但如果我们使用 Gorilla mux,我们就有一个明确的解决方案。

因为 Angular 是一个单页应用程序,所以我们必须这样处理。我有两个文件夹客户端和服务器。在客户端文件夹中,我保留了所有角度代码,在服务器文件夹中,我保留了所有服务器代码,因此呈现 index.html 的静态路径是“client/dist”。这里的 dist 文件夹是一个角度构建文件夹。

Go 路由器代码如下-

 func main {
router := mux.NewRouter()
spa := spaHandler{staticPath: "client/dist", indexPath: "index.html"}
router.PathPrefix("/").Handler(spa)
}

spaHandler实现了http.Handler接口(interface),所以我们可以使用它 响应 HTTP 请求。静态目录的路径和 该静态目录中索引文件的路径用于 在给定的静态目录中提供 SPA。

type spaHandler struct {
staticPath string
indexPath string
}

ServeHTTP 检查 URL 路径以在静态目录中定位文件 在 SPA 处理程序上。如果找到一个文件,它将被提供。如果不是,则 将提供位于 SPA 处理程序上索引路径的文件。这个 是为 SPA(单页应用程序)提供服务的合适行为。

func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

// get the absolute path to prevent directory traversal
path, err := filepath.Abs(r.URL.Path)
if err != nil {
// if we failed to get the absolute path respond with a 400 bad request
// and stop
http.Error(w, err.Error(), http.StatusBadRequest)
return
}

// prepend the path with the path to the static directory
path = filepath.Join(h.staticPath, path)

// check whether a file exists at the given path
_, err = os.Stat(path)
if os.IsNotExist(err) {
// file does not exist, serve index.html
http.ServeFile(w, r, filepath.Join(h.staticPath, h.indexPath))
return
} else if err != nil {
// if we got an error (that wasn't that the file doesn't exist) stating the
// file, return a 500 internal server error and stop
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

// otherwise, use http.FileServer to serve the static dir
http.FileServer(http.Dir(h.staticPath)).ServeHTTP(w, r)
}

关于使用 Angular.js 使用 Gorilla Mux 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26483975/

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