为什么我的golang模板没有选择外部javascript文件?

时间:2017-06-20 20:30:15

标签: go

我从堆栈溢出尝试了很多建议,但似乎没有任何工作。我无法选择外部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;。我不知道我在哪里做错了。

3 个答案:

答案 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