README.md

Router ir handlerai

Pridedame Chi routerΔ―, kuriame pirmuosius handlerius ir marΕ‘rutus.

Ε ios pamokos failai

go.modmain.gohandlers/home.gohandlers/middleware.godb/schema.sqltemplates/home.templ

Chi Router

main.go

Chi yra lengvas HTTP routeris. Pridedame:

go get github.com/go-chi/chi/v5
func main() {
    r := chi.NewRouter()
    r.Use(middleware.Logger)
    r.Use(handlers.LanguageMiddleware)
    r.Get("/", handlers.HandleHome(queries))
    r.Get("/stacks/{slug}", handlers.HandleStack(queries))
    r.Get("/lessons/{slug}", handlers.HandleLesson(queries))
    http.ListenAndServe(":8090", r)
}

{slug} nuskaitomas su chi.URLParam(r, "slug").

Handler struktΕ«ra

handlers/home.go

Kiekvienas handleris naudoja closure pattern.

func HandleHome(queries *internaldb.Queries) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        lang := GetLang(r)
        t := i18n.Get(lang)
        stacks, err := queries.GetAllStacks(r.Context())
        if err != nil {
            http.Error(w, "server error", 500)
            return
        }
        templates.HomePage(t, lang, stacks).Render(r.Context(), w)
    }
}
  • Vengiame globaliΕ³ kintamΕ³jΕ³
  • Lengva testuoti
  • AiΕ‘kios priklausomybΔ—s

Kalbos middleware

handlers/middleware.go

Middleware vykdomas prieΕ‘ kiekvienΔ… request.

func LanguageMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        lang := "lt"
        if cookie, err := r.Cookie("lang"); err == nil {
            if cookie.Value == "en" || cookie.Value == "lt" {
                lang = cookie.Value
            }
        }
        ctx := context.WithValue(r.Context(), LangKey, lang)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

Bet kuriame handleryje:

lang := GetLang(r)
Baigta

Sveikinu β€” projektas baigtas!

Tu kΔ… tik perΔ—jai visΔ… pilnΔ… projektΔ… nuo pirmo commit iki veikiančios aplikacijos.