Compojureのroutesで前処理を行う


Noirでは各、ルーティング後の処理の前に行う前処理をpre-routeとして定義できるようですが、Compojure自体にはその機能は無さそうだったので、sandbarのstateful-sessionを参考にして、下記の様なコードで実現しました。

広告
(defroutes app-routes
  (GET "/" {}
    "Hello World"))
 
(defn wrap-pre*
  [handler]
  (fn [request]
    (let [response (handler request)]
      (when response
        ;; ==========
        ;; 前処理
        ;; ==========
        response))))
 
(defn wrap-pre
  ([handler]
   (wrap-pre handler {}))
  ([handler options]
   (-> handler
     wrap-pre*)))
 
(def app
  (-> app-routes
    (wrap-pre)
    (wrap-stateful-session)))
 
(defn -main []
  (let [port (Integer/parseInt (get (System/getenv) "PORT" "8080"))]
    (run-jetty (handler/site app) {:port port})))

関連記事