Go语言与Angular的UI路由整合

3

我是一名新手Gopher,正在尝试创建一个Go后端来为我的AngularJS前端提供服务,并提供API。

以下是我目前的进展。

package main

import (
    "github.com/gorilla/mux"
    "log"
    "net/http"
)

func main() {
    rtr := mux.NewRouter()
    srtr := rtr.PathPrefix("/api").Subrouter()
    srtr.HandleFunc("/hello", hello).Methods("GET")
    rtr.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/")))

    http.Handle("/", rtr)

    log.Println("Listening...")
    http.ListenAndServe(":3000", nil)
}

func hello(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello World"))
}

一切运作良好。 /api/hello 返回 "Hello World",如果我访问 /,它将提供我的 index.html。然而,由于我正在尝试使用angular ui-router,因此我需要我的go服务器将所有未注册的路由发送到angular,以便angular ui-router可以处理它们。
例如:如果我现在去 /random,它会返回404,因为我在 ./static 下没有名为random的文件。但我想让Go将该请求转发到Angular,以便ui-router可以处理 /random

2
根据gorilla/mux文档,您可以设置自定义的404处理程序:http://www.gorillatoolkit.org/pkg/mux#Router - 在您的情况下,您可能希望将其设置为将所有不存在的路由指向/或类似的路径(即http.Redirect(w, r, "/", 302))。 - elithrar
1个回答

3

在您的路由器中,您应该将index.html提供给所有未定义的其他URL。在mux包中,有一个有用的处理程序: http://www.gorillatoolkit.org/pkg/mux#Router - 查看NotFoundHandler。

您可以使用它来处理所有404并提供index.html:

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/foo", fooHandler)
    r.NotFoundHandler = http.HandlerFunc(notFound)
    http.Handle("/", r)

}

并定义notFound函数:

func notFound(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, "static/index.html")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接