我有一个简单的React应用程序,我想从Go服务器后端提供服务。我听说此过程类似于提供静态html文件,但似乎无法正常工作。
当我尝试在浏览器上查看该应用程序时,它显示“此页面无效”,并且“本地主机已重定向太多次”
这是我在本地运行服务器以及尝试处理React应用程序的代码
func main() { r := mux.NewRouter() // handle app buildHandler := http.FileServer(http.Dir("./client/build/index.html")) r.PathPrefix("/").Handler(buildHandler) staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("./client/build/static"))) r.PathPrefix("/static/").Handler(staticHandler) r.HandleFunc("/", index).Methods("GET") srv := &http.Server{ Handler: r, Addr: "127.0.0.1:8080", WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } // serve fmt.Println("Server started on PORT 8080") log.Fatal(srv.ListenAndServe()) }
这是索引路由的代码
func index(w http.ResponseWriter, r *http.Request) { // not sure if this is necessary http.ServeFile(w, r, "index.html") }
我相信解决方案很简单,而且我很可能在某个地方犯了一个小错误。
在您的情况下,仅需要构建处理程序。它必须指向目录而不是文件。除路由外,其他处理程序已过时。
package main import ( "fmt" "github.com/gorilla/mux" "log" "net/http" "time" ) func main() { r := mux.NewRouter() r.HandleFunc("/route1", index).Methods("GET") r.HandleFunc("/route2", index).Methods("GET") buildHandler := http.FileServer(http.Dir("client/build")) r.PathPrefix("/").Handler(buildHandler) srv := &http.Server{ Handler: r, Addr: "127.0.0.1:8080", WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } fmt.Println("Server started on PORT 8080") log.Fatal(srv.ListenAndServe()) } func index(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "client/build/index.html") }
仅标准库可以实现相同的目的。
package main import ( "fmt" "log" "net/http" "time" ) func main() { r := http.NewServeMux() r.HandleFunc("/route1", index) r.HandleFunc("/route2", index) buildHandler := http.FileServer(http.Dir("client/build")) r.Handle("/", buildHandler) srv := &http.Server{ Handler: r, Addr: "127.0.0.1:8080", WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } fmt.Println("Server started on PORT 8080") log.Fatal(srv.ListenAndServe()) } func index(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "client/build/index.html") }