我从堆栈溢出尝试了很多建议,但似乎没有任何工作。我无法选择外部js文件。
我的主要职能:
package main
import(
"encoding/json"
"net/http"
"fmt"
"github.com/gorilla/mux"
"github.com/rs/cors"
"text/template"
)
func GetPeopleEndpoint(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")
t, _ := template.ParseFiles("index2.html")
t.Execute(w, nil)
}
func main() {
router := mux.NewRouter()
people = append(people, Person{ID: "1", Firstname: "Nic", Lastname: "Raboy", Address: &Address{City: "Dublin", State: "CA"}})
people = append(people, Person{ID: "2", Firstname: "Maria", Lastname: "Raboy"})
fmt.Println(people)
router.Handle("/files/", http.StripPrefix("/files/", http.FileServer(http.Dir("."))))
router.HandleFunc("/people", GetPeopleEndpoint)
c := cors.New(cors.Options{
AllowedOrigins: []string{"http://localhost:3000"},
AllowCredentials: true,
})
// Insert the middleware
handler := c.Handler(router)
// handler := cors.Default().Handler(router)
http.ListenAndServe(":12345", handler)
}
我的所有文件都在同一目录中。
这是我的HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
This is page2
<div id='newdiv'>
</div>
</body>
<script type="text/javascript" src="app2.js">
</script>
</html>
我得到的错误是&#34; GET http://localhost:12345/app2.js&#34;。我不知道我在哪里做错了。
答案 0 :(得分:4)
这一行:
router.Handle("/files/", http.StripPrefix("/files/", http.FileServer(http.Dir("."))))
表示请求来自&#34; / files /&#34;将使用&#34; / files /&#34;从当前目录中的磁盘上的文件提供服务。前缀已删除。
因此,如果您想要名为app2.js
的当前目录中的文件,则该网址必须为/files/app2.js
。
router.Handle
定义了处理给定路径的处理程序。在这种情况下,该路径为/files/
。由于尾部斜杠,相同的处理程序将用于以/files/
开头的所有网址。
http.StripPrefix
是一个处理程序包装器。它接收传入请求,剥离给定前缀(在本例中为/files/
),将其从URL路径中删除,然后将请求传递给传递给StripPrefix
的处理程序。
http.FileServer
提供http.FileSystem
中的文件,在这种情况下由http.Dir
提供。 http.Dir
公开目录中的文件,在本例中是当前工作目录("."
)。
因此,总的来说:以/files/
开头的请求将删除/files/
部分,然后留下任何内容,将在当前工作目录中查找该文件路径,如果是发现,它将被送达。因此,/files/app2.js
将投放./app2.js
。您的HTML必须引用/files/app2.js
,不 app.js
。
答案 1 :(得分:0)
假设你有目录结构:
<src-dir>
static
templates
...
您使用http.StripPrefix
router.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
将此行更新为 -
<script type="text/javascript" src="/static/app2.js"></script>
现在您可以通过http://localhost:12345/static/app2.js
答案 2 :(得分:0)
编写http.FileServer(http.Dir("."))
通常是一个坏主意,因为它不仅会公开您的.js文件,还会公开您的.go文件,使您通过http请求显示代码。例如,http://localhost:12345/main.go会使浏览器以源代码的形式提供源代码。
最佳做法应该是在分离的目录中收集静态文件(js,css,html ...),或者只收集一个,例如a&#34; resources&#34;封装
然后尝试
http.Handle("/files/", http.StripPrefix("/files/", http.FileServer(http.Dir("resources"))))
此代码将执行此工作,并允许您使用网址前缀/resources
访问/files
下的所有文件。例如:
http://localhost:12345/files/app2.js