使用compojure.route / resources和ring.middleware.resource / wrap-resource

时间:2013-11-30 17:25:01

标签: clojure compojure ring

我正在尝试使用ringcompojure学习clojure网站开发,我对compojure.route/resourcesring.middleware.resource/wrap-resource的使用情况有点不清楚。

我查看了API文档,以及compojure.routering.middleware.resource的来源。但是,我仍然不清楚是否需要同时使用compojure.route/resources路由和ring.middleware.resource/wrap-resource中间件,或者compojure.route/resources是否需要处理所有内容。

或者是优化问题?同样,使用wrap-resource可以避免组件路由开销?任何见解将不胜感激。

1 个答案:

答案 0 :(得分:7)

主要区别是compojure.route/resources仅提供来自特定路径的资源:

 (let [root (:root options "public")]
      (resource-response (str root "/" resource-path))

但如果没有找到资源,ring.middleware.resource/wrap-resource会在处理程序上提供故障恢复机制:

 (or (response/resource-response path {:root root-path})
     (handler request))

the resource-response功能看,两种选择都使用:

 (defn resource-response
  "Returns a Ring response to serve a packaged resource, or nil if the
   resource does not exist.
  Options:
    :root - take the resource relative to this root"

如果找不到请求的资源,则返回nil

因此,如果您已经有路线,wrap-resource替代方案更适合链接,例如:

(defroutes routes
  (GET "/" [] "<h1>Hello World</h1>")
  (route/not-found "<h1>Page not found</h1>"))

(def app (-> routes 
             (wrap-resource "public/resources"))

您可以将compojure.route/resources用于路线组合,如:

 (defroutes resources-routes
    (route/resources "/"))

 (defroutes routes
   (GET "/" [] "<h1>Hello World</h1>")
   (route/not-found "<h1>Page not found</h1>"))

 (def app
   (compojure.core/routes
       resources-routes
       routes))