我有一个环中间件,它使用标头值检查请求映射。 为了检查我必须打到数据库。
如果将defroutes作为以acommon URI模式开头的一组路由。 在处理之前,我不希望中间件运行任何与模式匹配的随机URL。
我只希望中间件运行一组URI,我只在defroutes中起诉。原因是中间件中存在数据库访问,我希望避免404响应具有相同的模式。
答案 0 :(得分:1)
这是comporoute,一个没有任何宏魔法的环处理程序,旨在实现可组合性和可扩展性。
即使它处于早期的alpha状态,它已经具有精确的文档字符串。它有一个名为内部中间件的功能来解决您遇到的问题。您可以(并且应该)仅将其用于您需要的内容,并将其余内容留给Compojure。
鉴于你的Compojure处理程序/ app被称为compojure
:
(defn demo-middleware
"A test midleware associng :bar to :foo of request"
[handler]
(fn [request]
(handler (assoc request :foo :bar))))
(defn demo-handler [request]
(ring.util.response/response
(str "id is " (get-in request [:params :id]) " "
":foo is" (:foo request))))
(def app
(comporoute.core/router
[["/demo-with-middleware"
[demo-middleware ;; all handlers in this vector are
;; wrapped via demo-middleware
["/:id" :demo-with demo-handler]]]
["/demo-without-middleware"
["/:id" :demo-without demo-handler]]]
:page-not-found compojure)
在shell
curl http://localhost:8080/demo-without-middleware/1234
id is 1234 :foo is
curl http://localhost:8080/demo-with-middleware/1234
id is 1234 :foo is :bar
# Everything else will be handled by compojure.
依赖关系向量[comporoute "0.2.0"]