“ http.FileServer(http.Dir ...))”在单独的程序包中不起作用

时间:2018-09-02 21:50:22

标签: go go-http

目录树:

.
├── main.go
└── web
    ├── app.go
    └── views
        ├── index.html
        └── js
            └── app.jsx

这有效:

package main

import (
    "net/http"
)

func main() {
    http.Handle("/", http.FileServer(http.Dir("./web/views")))
    http.ListenAndServe(":3000", nil)
}

但这返回404 page not found

main.go:

package main

import (
    "{dir with main.go}/web"
)

func main() {
    web.StartHttp()
}

app.go:

package web

import (
    "fmt"
    "net/http"
)

func StartHttp() {
    fmt.Println("STARTHTTP - CHECK 01")

    http.Handle("/", http.FileServer(http.Dir("./views")))
    http.ListenAndServe(":3000", nil)
}

终端打印STARTHTTP - CHECK 01,因此调用StartHttp()函数,终端要求允许传入的网络连接,因此http服务器似乎正在侦听端口。

是否存在某种类型的上下文没有传递给另一个包?

2 个答案:

答案 0 :(得分:5)

请记住,Go是一种编译语言;该程序所做的大多数事情都会在运行时发生。

尤其是在这种情况下,对http.Dir()的调用在运行时发生,这意味着该路径是在运行时求值的。

由于给定的路径是相对路径,因此它是相对于运行应用程序的工作目录的路径。源代码所在的目录与此处无关。

在对http.Dir()的一次调用中,您给出了参数./web/views,但在另一个调用中,给出了参数./views。事实证明,基于执行程序的目录的正确路径是./web/views。使用错误的路径执行程序时,会出现404 page not found错误,因为指定的路径在您的工作目录中不存在。

答案 1 :(得分:2)

您提供给http.Dir的路径是相对于应用程序运行的位置(它的工作目录,即您发布的目录树的根目录),而不是相对于.go的位置文件是。只需将路径更改为./web/views,它应该可以工作。

在您的情况下,将返回404 Not Found,因为目录树的顶层没有views文件夹,因此没有要提供的文件。