Это может быть просто из-за моей неопытности, но я принял решение веб-сервера, написанное в Go, и у меня есть некоторые проблемы.
Маршрутизация настроена таким образом, что каждый «верхний» маршрут подключается к маршрутизатору с помощью router.Mount () с обработчиком, подключенным к каждому подключенному маршруту. Пример:
router.Mount("/group", (handler.NewGroupHandler(groupSrv, render)).Router())
Итак, в этом смонтированном маршруте я хочу добавить промежуточное ПО для получения указанного c параметра URL. Я пробовал и следовал этому руководству https://medium.com/@szablowska.patrycja / chi-and-missing-urlparam-in-middleware-9435c48a063b , которое, похоже, сработало для других. Тем не менее, это не сработало для меня, что я теперь подозреваю, из-за подхода с монтажом.
Идея промежуточного программного обеспечения довольно проста, просто проверьте параметр URL на соответствие некоторым требованиям. Конечно, я мог бы делать это вручную на каждом пути, но промежуточное ПО было бы лучше как для удобочитаемости, так и для будущего развития. Как написано промежуточное программное обеспечение:
func GroupMiddleware() func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
groupIDStr := chi.URLParam(r, "group_id")
if checkAgainstGroupID {
// Do something, raise error
} else {
next.ServeHTTP(w, r)
}
}
return http.HandlerFunc(fn)
}
}
И затем применяется так:
r.With(subhandler.GroupMiddleware).Route("/{group_id}", func(r chi.Router) {
r.Get("/", h.get)
})
Что, очевидно, не работает. Буду признателен за любую помощь, потому что я не могу поверить, что монтирование маршрутов делает невозможным добавление промежуточного программного обеспечения в подгруппы.
Редактировать: Это работало отлично, только я не заметил, что я назвал незатронутый маршрут. Поэтому, если кому-то еще придется ответить на этот же вопрос, знайте, что это действительно правильный подход.