Go web endpoint cannot find static index.html file

WBOY
Release: 2024-02-09 11:18:17
forward
1128 people have browsed it

Go Web端点找不到静态index.html文件

php Editor Banana found that when using Go language to develop web applications, we sometimes encounter a common problem: when we try to access the web endpoint, we receive a 404 Error, prompting that the static index.html file cannot be found. This question can be confusing for developers, especially for beginners. So, how should we solve this problem? Next, we will introduce the solution in detail to help you solve this problem smoothly.

Question content

This is my code:

package main

import (
    "fmt"
    "log"
    "net/http"
)

const customport = "3001"

func main() {
    fileserver := http.fileserver(http.dir("./static"))
    port:= fmt.sprintf(":%s", customport)
    http.handle("/", fileserver)

    fmt.printf("starting front end service on port %s", port)
    err := http.listenandserve(port, nil)
    if err != nil {
        log.panic(err)
    }
}
Copy after login

The top level folder is microservices and is set up as the go workspace. This web service will be one of many. It is located in the following folder:

microservices
 |--frontend
    |--cmd
       |--web
          |--static
             |--index.html
       |--main.go
Copy after login

I'm in the top level microservice folder and I start it with: go run ./frontend/cmd/web. It starts fine with no errors. But when I go to chrome and type http://localhost:3001 I get 404 Page Not Found. Even http://localhost:3001/index.html will give 404 Page Not Found. I just learned go and I don’t know why I can’t find the ./static folder?

Workaround

According to your command, the path must be ./frontend/cmd/web/static, not just ./static. That's not portable; the path changes with the working directory.

Consider embedding static directories. Otherwise, you must make the path configurable (flags, environment variables, etc.)

The disadvantage of embedding is that you have to rebuild the program after making any changes to the static files.

You can also use a hybrid approach. If the flag (or other) is set, use that to serve from disk, otherwise use the embedded file system. This flag is convenient during development, and the embedded file system makes deployment easy since you only need to copy the program binaries.

package main

import (
    "embed"
    "flag"
    "io/fs"
    "net/http"
    "os"
)

//go:embed web/static
var embeddedAssets embed.FS

func main() {
    var staticDir string

    flag.StringVar(&staticDir, "static-dir", staticDir, "Path to directory containing static assets. If empty embedded assets are used.")
    flag.Parse()

    var staticFS fs.FS = embeddedAssets
    if staticDir != "" {
        staticFS = os.DirFS(staticDir)
    }

    http.Handle("/", http.FileServer(http.FS(staticFS)))

    // ...
}
Copy after login

The above is the detailed content of Go web endpoint cannot find static index.html file. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template