0

目录树:

.
├── 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()
}

应用程序.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 服务器似乎正在侦听该端口。

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

4

2 回答 2

5

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

特别是,在这种情况下,调用http.Dir()发生在运行时,这意味着路径是在运行时评估的。

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

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

于 2018-09-02T22:21:23.177 回答
2

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

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

于 2018-09-02T21:54:55.080 回答