FileServe和Routing更加流畅的合作

时间:2015-07-26 12:23:31

标签: angularjs go router gorilla

我有一个问题,我想在FileServe /上提供我的主要AngularJS(Yeoman部署)应用程序文件夹,但它会破坏我的所有路由器绑定。有什么方法可以保留它们并保持我的路线不受影响吗?

在下面的代码中,我仍然需要转到/app并重新绑定其他文件夹,因为我不想过多地使用Grunt文件进行调整,所以添加了一些额外的备份文件夹的路径绑定。

func initializeRoutes() {
    // Handle all requests by serving a file of the same name
    fileHandler := http.FileServer(http.Dir(*clFlagStaticDirectory))
    bowerFileHandler := http.FileServer(http.Dir("../bower_components"))
    imagesFileHandler := http.FileServer(http.Dir("../app/images"))
    scriptsFileHandler := http.FileServer(http.Dir("../app/scripts"))
    stylesFileHandler := http.FileServer(http.Dir("../app/styles"))
    viewsFileHandler := http.FileServer(http.Dir("../app/views"))

    // Setup routes
    mainRoute := mux.NewRouter()
    mainRoute.StrictSlash(true)
    // mainRoute.Handle("/", http.RedirectHandler("/static/", 302))
    mainRoute.PathPrefix("/app").Handler(http.StripPrefix("/app", fileHandler))
    mainRoute.PathPrefix("/app/bower_components").Handler(http.StripPrefix("/bower_components", bowerFileHandler))
    mainRoute.PathPrefix("/bower_components").Handler(http.StripPrefix("/bower_components", bowerFileHandler))
    mainRoute.PathPrefix("/images").Handler(http.StripPrefix("/images", imagesFileHandler))
    mainRoute.PathPrefix("/scripts").Handler(http.StripPrefix("/scripts", scriptsFileHandler))
    mainRoute.PathPrefix("/styles").Handler(http.StripPrefix("/styles", stylesFileHandler))
    mainRoute.PathPrefix("/views").Handler(http.StripPrefix("/views", viewsFileHandler))

    // Basic routes
    // User routes
    userRoute := mainRoute.PathPrefix("/users").Subrouter()
    userRoute.Handle("/login", handler(userDoLogin)).Methods("POST")
    userRoute.Handle("/logout", handler(userDoLogout)).Methods("GET")
    userRoute.Handle("/forgot_password", handler(forgotPassword)).Methods("POST")

    // Bind API Routes
    apiRoute := mainRoute.PathPrefix("/api").Subrouter()

    apiProductModelRoute := apiRoute.PathPrefix("/productmodels").Subrouter()
    apiProductModelRoute.Handle("/", handler(listProductModels)).Methods("GET")
    apiProductModelRoute.Handle("/{id}", handler(getProductModel)).Methods("GET")

    // Bind generic route
    http.Handle("/", mainRoute)
}

所以我的目标是将服务器/app作为我的/主路径,但保留我所有的Mux路由以赢得FileServe。因此,如果我有一个/app/users/login文件夹,它就不会加载,但它会让路由器获胜。

注意:我的服务纯粹超过HTTPS而没有超过HTTP

非常感谢!这是打破我的大脑,这是我在完全开始使用我的前端代码之前需要弄清楚的最后一件事:)。

1 个答案:

答案 0 :(得分:1)

它让我觉得您希望以/users之前匹配的/login/和类似方式更改路径评估方式。 /应该是FileServer的服务器。

据我所知,路由将按照它们的定义(添加到路由器)的顺序进行匹配。因此,您只需在/之前移动API和其他动态路由。

以下代码的工作原理类似:

  • 在文件服务器之前评估/test匹配并返回字符串" OK"
  • 然后文件服务器返回路径
  • 下的文件

代码:

package main

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

func main() {
    appFileHandler := http.FileServer(http.Dir("/Users/alex/Projects/tmp/so/app"))
    r := mux.NewRouter()
    r.PathPrefix("/test").HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
        w.Write([]byte("OK"))
    })
    r.PathPrefix("/").Handler(appFileHandler)
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}