"http.FileServer(http.Dir...))" не работает в отдельном пакете
Дерево каталогов:
.
├── 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 ответа
Помните, что Go - это скомпилированный язык; почти все, что делает программа, происходит во время выполнения.
В частности, в этом случае вызов http.Dir()
происходит во время выполнения, и это означает, что путь оценивается во время выполнения.
Поскольку указанный вами путь является относительным, он относится к рабочему каталогу, из которого вы запускаете приложение. Каталог, в котором находился исходный код, здесь не актуален.
В одном вызове http.Dir()
вы приводите аргумент ./web/views
, а в другом вы приводите аргумент ./views
, Оказывается, правильный путь на основе каталога, из которого вы выполнили программу, был ./web/views
, Когда вы запускаете программу с неверным путем, вы получаете 404 page not found
ошибки, поскольку указанный путь не существует в вашем рабочем каталоге.
Путь, который вы даете http.Dir
Относительно того, где запущено приложение (его рабочий каталог, корень дерева каталогов, которое вы разместили, в вашем случае), а не относительно того, где .go
файл есть. Просто измените путь к ./web/views
и это должно работать.
В вашем случае 404 Not Found
возвращается, потому что нет views
папка на верхнем уровне вашего дерева каталогов и, следовательно, нет файлов для обслуживания.