31
loading...
This website collects cookies to deliver better user experience
r.Use
where r is the router. Either a nested router like in this example.r.Route("/user", func(r chi.Router) {
r.Use(user.UserContextBody)
r.Route("/{username}", func(r chi.Router) {
// your code
})
})
r := chi.NewRouter()
// middleware stack
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
next
in the Chi library.func UserContextBody(next http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
var user User
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
fmt.Println(err)
return
}
ctx := context.WithValue(r.Context(), "user", user)
next.ServeHTTP(rw, r.WithContext(ctx))
})
}
User
struct but it could be a string, and int or whatever type it's being passed in the context.// example for getting a string from context
ctx := r.Context()
key := ctx.Value("key").(string)
r.Use(UserContextBody)
r.Route("/{username}", func(r chi.Router) {
r.Get("/", func(rw http.ResponseWriter, r *http.Request) {
// your code
})
})
r.Post("/", func(rw http.ResponseWriter, r *http.Request) {
u := r.Context().Value("user").(User)
// your code
})