"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 папка на верхнем уровне вашего дерева каталогов и, следовательно, нет файлов для обслуживания.

Другие вопросы по тегам