«http.FileServer (http.Dir ...))» не работает в отдельном пакете - PullRequest
0 голосов
/ 03 сентября 2018

Дерево каталогов:

.
├── 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 голосов
/ 03 сентября 2018

Помните, что Go - это скомпилированный язык; почти все, что делает программа, происходит во время выполнения.

В частности, в этом случае вызов http.Dir() происходит во время выполнения, а это означает, что путь оценивается во время выполнения.

Поскольку указанный вами путь является относительным, он относительно рабочего каталога, из которого вы запускаете приложение. Каталог, в котором находился исходный код, здесь не уместен.

В одном вызове http.Dir() вы даете аргумент ./web/views, а в другом вы даете аргумент ./views. Получается, что правильный путь на основе каталога, из которого вы запустили программу, был ./web/views. Когда вы запускаете программу с неверным путем, вы получаете 404 page not found ошибки, поскольку указанный путь не существует в вашем рабочем каталоге.

0 голосов
/ 03 сентября 2018

Путь, который вы указываете к http.Dir, зависит от того, где запущено приложение (его рабочий каталог, корень дерева каталогов, которое вы разместили, в вашем случае), а не от того, где находится файл .go. Просто измените путь на ./web/views, и он должен работать.

В вашем случае возвращается 404 Not Found, поскольку на верхнем уровне дерева каталогов нет папки views и, следовательно, нет файлов для обслуживания.

...