分解环形中间件场景

Breaking down the ring middleware scenario

Ring 非常时尚,并且有一些非常合理的中间件默认值。

当我通过 leiningen (lein) 制作新应用时,我在 router/handler

中得到了类似的东西
(def app
  (wrap-defaults app-routes site-defaults))

https://github.com/ring-clojure/ring-defaults

现在我想添加更多中间件 (cemerick/friend),这样我就可以做一些事情,比如登录验证。

那么,我如何将上面的内容翻译成更让人联想到环中间件 "stack," 的东西,就像页面底部 https://github.com/ring-clojure/ring-defaults/blob/master/src/ring/middleware/defaults.clj

(def app
  (-> handler  
    (wrap-anti-forgery)
    (wrap-flash)
    (wrap-session)
    (wrap-keyword-params)
    (wrap-resource)
    (wrap wrap-file)))

因为 ring 只是使用中间件的函数组合,你可以简单地将 friend 围绕调用来包装默认值:

(def app 
  (my-additional-middleware 
    (wrap-defaults app-routes site-defaults)
  arguments to my additional middleware))

或者你可以线程化它(例如当你有多个中间件时):

(def app
  (-> (wrap-defaults app-routes site-defaults)
      (friend-stuff arg arg)
      (other-middleware arg arg arg))

正确获取中间件的顺序仍然取决于您:-/