使用go-net/http mux为单页应用程序提供服务

使用go-net/http mux为单页应用程序提供服务,http,go,reactjs,Http,Go,Reactjs,我正在构建一个api,它也为我的react前端应用程序服务,但在服务index.html时遇到了一个问题 考虑到它不是一个真正的go模板,我不会使用html/模板 我并没有看到一种直接的方式来在路由中没有启动/api的所有页面上为我的应用程序的静态html根提供服务 我故意不使用gorilla的mux之外的任何go框架 我的handler.go: func Index(w http.ResponseWriter, r *http.Request) { http.FileServer(ht

我正在构建一个api,它也为我的react前端应用程序服务,但在服务index.html时遇到了一个问题

考虑到它不是一个真正的go模板,我不会使用html/模板

我并没有看到一种直接的方式来在路由中没有启动/api的所有页面上为我的应用程序的静态html根提供服务

我故意不使用gorilla的mux之外的任何go框架

我的handler.go:

func Index(w http.ResponseWriter, r *http.Request) {
    http.FileServer(http.Dir("./views"))
}
Routes.go:

type Route struct {
    Name        string
    Method      string
    Pattern     string
    HandlerFunc http.HandlerFunc
}

type Routes []Route

var routes = Routes{
    Route{
        "Index",
        "GET",
        "/",
        Index,
    },
}
路由器,开始

import (
    "net/http"

    "github.com/gorilla/mux"
)

func NewRouter() *mux.Router {

    router := mux.NewRouter().StrictSlash(true)
    for _, route := range routes {
        var handler http.Handler

        handler = route.HandlerFunc
        handler = Logger(handler, route.Name)

        router.
            Methods(route.Method).
            Path(route.Pattern).
            Name(route.Name).
            Handler(handler)

    }

    return router
}
主要内容:

package main

import (
    "./server"
    "log"
    "net/http"
)

func main() {

    router := server.NewRouter()

    log.Fatal(http.ListenAndServe(":8080", router))
}
现在会出现一个空白页,就是这样。我的index.html位于可执行文件的
/views/index.html
中(但我也尝试了处理程序)

更新


我能够使用这个问题中所示的方法为html文件提供服务:但是使用mux和更模块化的文件结构仍然可以生成一个漂亮、干净的空白页面。

在handler.go中,您的索引函数实际上是一个no op,因为
http.FileServer()
返回一个处理程序,这是从来没有通过响应作者或请求,因此空白页。< /P> 也许尝试一下这样的方法至少可以克服这个问题:

func Index(w http.ResponseWriter, r *http.Request) {
    http.FileServer(http.Dir("./views")).ServeHTTP(w, r)
}

答对了,我在想这可能与回应者缺乏行动有关。不幸的是,该文件夹中的其他静态文件(css和js)无法通过。我认为这是因为路由模式非常具体。如果您按名称调用index.html,则即使是index.html也不会返回,只会将其命名为“/”。可能是“/{file}”而不是“/”,这取决于它与您拥有的其他路由的交互方式(尽管您可能不希望从根路径提供所有静态内容)。实际上,我是从/dist(而不是上面看到的/views)文件夹提供服务的/{file}也得到了一个404。我在路由器`` router.PathPrefix(“/”).Handler(http.FileServer(http.Dir(“./dist”))))``中添加了一个PathPrefix,现在我的其他文件都被保存了。你想用Go来提供静态内容有什么特别的原因吗?您可以将nginx设置为提供静态内容,并将其他内容转发给您的Go程序。我没有使用nginx的经验,我知道使用Go是可行的:)