为什么Go 1.22中新的高级路由无法到达GET处理函数?

问题描述 投票:0回答:1

我正在尝试新的 go 1.22 功能,但我似乎无法到达 GET “/users/register” 处理函数,而是收到 404。这里有什么问题? main 包中的片段:

func main() {
    if err := godotenv.Load(); err != nil {
        log.Fatal("Failed to load .env:", err)
    }

    _, err := repository.InitDB()
    if err != nil {
        log.Fatal("Failed to initialise the database:", err)
    }

    userMux := http.NewServeMux()
    if err := handlers.InitUserRoutes(userMux); err != nil {
        log.Fatal("Failed to initialise user routes:", err)
    }

    mux := http.NewServeMux()
    mux.Handle("/users/", userMux)
    log.Fatal(http.ListenAndServe(fmt.Sprintf("%s:%s", os.Getenv("DOMAIN"), os.Getenv("PORT")), mux))
}

来自包裹处理程序的片段:

var templates *template.Template

func InitUserRoutes(mux *http.ServeMux) error {
    var err error
    templates, err = utils.ParseTemplates("web/templates/user")
    if err != nil {
        return err
    }

    mux.HandleFunc("GET /register/", registerGet)
    mux.HandleFunc("POST /register/", registerPost)

    return nil
}

func registerGet(w http.ResponseWriter, r *http.Request) {
    fmt.Println("I'm here")
    err := templates.ExecuteTemplate(w, "register.html", nil)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

func registerPost(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Printf("%#v\n\n%#v", r.Form, r.PostForm)
    email, username, password := r.FormValue("email"), r.FormValue("username"), r.FormValue("password")
    fmt.Printf("%v, %v, %v\n", email, username, password)
}

来自包 utils 的片段:

func ParseTemplates(folderPath string) (*template.Template, error) {
    return template.ParseGlob(filepath.Join(folderPath, "*.html"))
}
go routes handler
1个回答
0
投票

对我来说效果很好

package main

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

func main() {
    prefix := "/users"
    userMux := http.NewServeMux()
    userMux.HandleFunc("GET /register/", registerGet)
    userMux.HandleFunc("GET /register2/", registerGet)
    userMux.HandleFunc("POST /register/", registerPost)

    mux := http.NewServeMux()
    mux.Handle("/users/{pathname...}", http.StripPrefix(prefix, userMux))
    log.Fatal(http.ListenAndServe(":12345", mux))
}

func registerGet(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, r.Method, "I'm here", r.RequestURI)
}

func registerPost(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, r.Method, "I'm here", r.RequestURI)
}

© www.soinside.com 2019 - 2024. All rights reserved.