我正在尝试使用ring和compojure学习clojure网站开发,我对compojure.route/resources
和ring.middleware.resource/wrap-resource
的使用情况有点不清楚。
我查看了API文档,以及compojure.route
和ring.middleware.resource
的来源。但是,我仍然不清楚是否需要同时使用compojure.route/resources
路由和ring.middleware.resource/wrap-resource
中间件,或者compojure.route/resources
是否需要处理所有内容。
或者是优化问题?同样,使用wrap-resource
可以避免组件路由开销?任何见解将不胜感激。
答案 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))