2016-04-09 9 views
1

Ich baue eine Single-Page-Anwendung mit Angular 2 und Go, und in Angular verwende ich Routing. Wenn ich die Seite zu öffnen, sagen wir, http://example.com/ wird Go mir dienen meine index.html Datei, was gut ist, weil ich dies schrieb:Wie kann eine Datei geliefert werden, wenn die URL nicht mit einem Muster in Go übereinstimmt?

mux.Handle("/", http.FileServer(http.Dir(mysiteRoot))) 

Jetzt habe ich einen Weg in Angular, sagen wir mal, /posts, und wenn es eine Standardroute (das heißt, wenn useAsDefault ist true) oder wenn ich nur manuell auf http://example.com/posts gehe, bekomme ich einen 404-Fehler von Go, was bedeutet, dass kein Handler für diesen Pfad angegeben ist.

Ich denke nicht, dass das Erstellen eines Handlers in Go für jede einzelne Winkelroute eine gute Idee ist, da es viele Routen geben kann. Also meine Frage ist, wie kann ich index.html in Go dienen, wenn die Anfrage-URL nicht mit einem anderen Muster übereinstimmt, das ich in meinem ServeMux eingestellt habe?

Antwort

1

Nun, das war eigentlich ziemlich einfach. Die net/http Dokumentation says dies:

Beachten Sie, dass da ein Muster mit einem verwurzelten Unterbaum in einem Slash Namen mit der Endung, das Muster „/“ alle Pfade paßt nicht von anderen registrierten Mustern paßt, nicht nur die URL mit Pfad == "/"

Also musste ich etwas mit meinem Handler "/" tun. http.FileServer sucht nach Dateien in einem Verzeichnis, das in der Musterzeichenfolge angegeben ist, so dass ich ersetzt es nur mit diesem:

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

Und es funktioniert gut.

0

Ich denke, Sie müssen die URL-Provider-Einstellungen in Ihrer angular2 App ändern, um HashLocationStrategy zu verwenden. Mit diesem wird Ihre Routen von der Form

#/Beiträge

und wird jede Route in Ihrer golang App nicht auslösen.

Verwandte Themen