web-dev-qa-db-fra.com

Golang + Angular

J'ai commencé à essayer de travailler avec Go et Angular, mais j'ai un problème étrange. Je suppose qu'il me manque un petit détail, mais je n'arrive pas à le comprendre.

J'utilise https://github.com/julienschmidt/httprouter en tant que routeur pour Go ... maintenant avec Angular, je devrais pouvoir copier-coller une URL dans le navigateur et Angular devrait gérer les routes selon, non?

J'ai un "/ login" route. Ce qui fonctionne si la route est accessible via le front-end ... mais pas si je tape "mypage.com/login" dans le navigateur, obtenant un 404. 

Aller au routage ne fait que faire 

router.NotFound = http.FileServer(http.Dir("./public"))

Ce qui fonctionne pour la route "/", mais pas pour autre chose. Ce qui semble être correct. Mais comment puis-je configurer le routage correctement, de sorte que Angular gère tout le routage?

12
user2515948

C’est ce que j’utilise avec la bibliothèque standard Go et le routage fonctionne très bien.

Découvrez la fonction Adapter ici

// Creates a new serve mux
mux := http.NewServeMux()

// Create room for static files serving
mux.Handle("/node_modules/", http.StripPrefix("/node_modules", http.FileServer(http.Dir("./node_modules"))))
mux.Handle("/html/", http.StripPrefix("/html", http.FileServer(http.Dir("./html"))))
mux.Handle("/js/", http.StripPrefix("/js", http.FileServer(http.Dir("./js"))))
mux.Handle("/ts/", http.StripPrefix("/ts", http.FileServer(http.Dir("./ts"))))
mux.Handle("/css/", http.StripPrefix("/css", http.FileServer(http.Dir("./css"))))

// Do your api stuff**
mux.Handle("/api/register", util.Adapt(api.RegisterHandler(mux),
    api.GetMongoConnection(),
    api.CheckEmptyUserForm(),
    api.EncodeUserJson(),
    api.ExpectBody(),
    api.ExpectPOST(),

))
mux.HandleFunc("/api/login", api.Login)
mux.HandleFunc("/api/authenticate", api.Authenticate)

// Any other request, we should render our SPA's only html file,
// Allowing angular to do the routing on anything else other then the api    
// and the files it needs for itself to work.
// Order here is critical. This html should contain the base tag like
// <base href="/"> *href here should match the HandleFunc path below 
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, "html/index.html")
})
12
CESCO

Vous pouvez utiliser directement le package http.

Sommaire

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

Cela servira le fichier index.html pour toutes les demandes qui ne correspondent pas à une route.

Serveur de fichiers

http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./public"))))

Cela servira tous les fichiers du répertoire public.

N'oubliez pas de démarrer votre serveur

http.ListenAndServe(":8000", nil)
2
jmaloney

utiliser le cadre micro goji

https://github.com/zenazn/goji

C'est facile à utiliser

func render_html_page(w http.ResponseWriter, url string) {
    t, err := template.ParseFiles(url) 
    if err != nil {
        panic (err)
    }
    t.Execute(w, nil)
}

func index(c web.C, w http.ResponseWriter, r *http.Request) {
    render_html_page(w, "./public/index.html")
}

func main() {
        goji.Get("/", index)
        goji.Serve()
}

ce code fonctionne, vous devez juste importer

1
Fantasim

Veuillez définir le gestionnaire router.Notfound pour servir le fichier index.html angulaire.

import (
  "log"
  "net/http"

  "github.com/julienschmidt/httprouter"
)

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

func main() {
  router := httprouter.New()

  // handle angular
  router.NotFound = http.HandlerFunc(angularHandler)

  // serve static files
  router.ServeFiles("/*filepath", http.Dir("./public"))

  log.Fatal(http.ListenAndServe(":3000", router))
}
0
Danila Pavilov

J'ai eu le problème exact 404. Ce routage est html5mode. Vous devez en informer les gestionnaires dans votre application.yaml. Vérifiez ici mon fork du projet Tour of Heroes https://github.com/nurp/angular2-tour-of-heroes

l'ajouter à votre application.yaml pourrait résoudre le problème.

- url: /.*
  static_files: index.html
  upload: index.html
0
nurp