У меня есть несколько маршрутов.
(defroutes some-routes
(GET "one" [] one)
(GET "two" [] two))
(defroutes other-routes
(GET "three" [] three)
(GET "four" [] four))
(defroutes more-routes
(GET "five" [] five)
(GET "six" [] six))
(def all-routes
(routes app-routes
(-> some-routes session/wrap-session my-interceptor)
(-> more-routes session/wrap-session my-other-interceptor)
other-routes))
Я хочу перехватить some-routes
, но не other-routes
, и выполнить тест на основе запроса (проверка наличия ключа в сеансе и некоторые другие вещи). У меня больше одного из них. my-other-interceptor
делает то же самое, но по-другому.
Итак, я начинаю с этого:
(defn my-interceptor [handler]
(fn [request]
(prn (-> request :session :thing-key))
(let [thing (-> request :session :thing-key-id)]
(if (nil? thing)
(-> (response "Not authenticated"))
(handler request)))))
Это позволит получить доступ к обработчику, если в сеансе установлено :thing-key
.
К сожалению, это не очень хорошо работает с более чем одним набором маршрутов. Эта проверка должна применяться только к some-routes
, а не к other-routes
. Но пока мы не выполним обработчик, мы не знаем, совпадает ли маршрут. И в этот момент обработчик уже выполнился. Я мог бы переписать его для выполнения handler
, а затем выполнить проверку только в том случае, если ответ не равен нулю, но это означает, что я выполнил обработчик перед проверкой аутентификации.
Я следовал этому примеру, который демонстрирует проблему:
(defn add-app-version-header [handler]
(fn [request]
(let [resp (handler request)
headers (:headers resp)]
(assoc resp :headers
(assoc headers "X-APP-INFO" "MyTerifficApp Version 0.0.1-Alpha")))))
Как мне это сделать? Я хочу:
- способ проверки ответа (и некоторой другой логики) перед обработкой запроса
- которые я могу применить к большому набору обработчиков маршрутов
- применяется не ко всем маршрутам в приложении
- У меня будет более одного такого обработчика, выполняющего различные проверки сеанса.
Как мне это сделать?