-
-
Notifications
You must be signed in to change notification settings - Fork 997
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
URL params are not available inside middleware on the root router #892
Comments
I have the same issue |
This behavior is due to the way the chi router handles middleware and route patterns. When you register a middleware using r.Use() at the root level, the middleware is applied to all routes, including routes that do not have any URL parameters. As a result, when the middleware tries to extract the "id" parameter using chi.URLParam(r, "id"), it doesn't find it because the current route doesn't have an "id" parameter. |
The behavior you describe would be what I would expect to be the behavior, but the problem is that when I execute an HTTP request for a route which does have an |
v1Router := chi.NewRouter()
v1Router.Route("/test/{id}", func(r chi.Router) {
r.Use(Middleware)
r.Get("/", handler.getHandler)
r.Patch("/", handler.updateHandler)
r.Delete("/", handler.deleteHandler)
}) |
Thanks! That works but is super optimal. I need to repeat the middleware call for every endpoint group. Example: v1Router := chi.NewRouter()
v1Router.Route("/test/{id}", func(r chi.Router) {
r.Use(Middleware)
r.Get("/", handler.getHandler)
r.Patch("/", handler.updateHandler)
r.Delete("/", handler.deleteHandler)
})
v1Router := chi.NewRouter()
v1Router.Route("/another-test/{id}", func(r chi.Router) {
r.Use(Middleware)
r.Get("/", handler.getHandler)
r.Patch("/", handler.updateHandler)
r.Delete("/", handler.deleteHandler)
}) That is a problem because I want to ensure that the middleware (authZ) is called on every request. Do I miss anything here or is there a better way to get the URL params in the middleware (I need the params to make a call on the authZ). |
@jfcdigitalventures You could wrap everything in a |
We must wrap the affected routes in a Group with the middleware applied to that group, moving the middleware higher doesn't work. See go-chi/chi#892 for details. This lays the groundwork for future hole/lang renames like Lisp → Common Lisp. Updates #1318
We must wrap the affected routes in a Group with the middleware applied to that group, moving the middleware higher doesn't work. See go-chi/chi#892 for details. This lays the groundwork for future hole/lang renames like Lisp → Common Lisp. Updates code-golf#1318
When I create a middleware to log the
id
URL parameter, which exists in the route I request, the value is always empty. I do get a value inside the handler itselfWhen I move this code to a
Group
, the URL param will become available inside the middleware.I think this behavior is quite strange and prone to errors
Tested with the latest version (5.0.11)
The text was updated successfully, but these errors were encountered: