2014-07-20 61 views
4

我是一個新的Gopher,嘗試做一個Go後端來服務我的Angularjs前端,並且還提供API。Go + Angular ui-router

這是我到目前爲止。

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返回「你好世界」,如果我去/它將服務我的index.html。然而,因爲我正在嘗試使用角度ui路由器,所以我需要我的轉發服務器將所有未註冊的路由發送到有角度的ui路由器可以處理它們。

例如:如果我現在去/random它將返回一個404,因爲我沒有任何名爲random的./static下的文件。但我想要的是轉發到Angular的這個請求,所以UI路由器可以處理/random

+2

您可以根據大猩猩/多路複用文檔設置自定義404處理程序:http://www.gorillatoolkit.org/pkg/mux#Router - 在您的情況下,您可能希望將其設置爲指示所有非存在到'/'或類似路徑(即'http.Redi rect(w,r,「/」,302)') – elithrar

回答

3

在您的路由器您應該爲所有未定義的其他URL提供index.html。在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") 
}