Compojure/Ringのmiddlewareについて


ClojureでWebアプリを作っていて、よくわからないもやもやした概念の一つはmiddlewareでしょう。

概念なので、どういうものかがわかってしまえば、関数のスタイルということがわかり、悩むこともなくなります。

middlewareは、handlerを受け取り、引数が一つの関数を返します。

その返す関数というのが、リクエストを受け取り、handlerを返す関数です。

つまり、もっともシンプルなmiddlewareというのはこんなものです。

(defn hoge-middleware [handler]
  (fn [request]
    (println request)
    (handler request)))

handlerにrequestを適用させると、handlerが返ります。

ちなみに、requestというのは、ringの仕様に沿ったハッシュマップです。

ということで、middlewareは、こんな感じで、handlerを延々と渡していくことで利用が可能というわけです。

(def app
  (-> (routes (routes-a routes-b)
      middleware-a
      middleware-b
      middleware-c))

とてもシンプルな考え方で素晴らしいと思いました。

Comments are closed.