如何将环中间件应用于特定的路由组?

时间:2014-04-22 06:41:06

标签: clojure compojure ring

我有一个环中间件,它使用标头值检查请求映射。 为了检查我必须打到数据库。

如果将defroutes作为以acommon URI模式开头的一组路由。 在处理之前,我不希望中间件运行任何与模式匹配的随机URL。

我只希望中间件运行一组URI,我只在defroutes中起诉。原因是中间件中存在数据库访问,我希望避免404响应具有相同的模式。

1 个答案:

答案 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"]