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

Clojure 如何将环形中间件应用于特定的路由组?,clojure,compojure,ring,Clojure,Compojure,Ring,我有一个环形中间件,它使用头值检查请求映射。 为了检查,我必须点击数据库 如果将路由定义为一组以常见URI模式开始的路由。 我不希望中间件在处理之前运行任何与模式匹配的随机URL 我只希望中间件只为我在defroutes内部起诉的某组URI运行。原因是中间件中存在数据库访问,对于具有相同模式的404响应,我希望避免这种访问。这里是一个没有任何宏魔法的环处理程序,旨在实现可组合性和可扩展性 尽管它处于早期的alpha状态,但它已经有了精确的docstring。它有一个称为内部中间件的特性来解决您遇

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

如果将路由定义为一组以常见URI模式开始的路由。 我不希望中间件在处理之前运行任何与模式匹配的随机URL

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

这里是一个没有任何宏魔法的环处理程序,旨在实现可组合性和可扩展性

尽管它处于早期的alpha状态,但它已经有了精确的docstring。它有一个称为内部中间件的特性来解决您遇到的问题。你可以(也应该)只在你需要的时候使用它,剩下的就留给Compojure吧

如果您的Compojure处理程序/应用程序被称为
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)
在外壳上

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.

依赖向量
[composeRoute“0.2.0”]

我是否需要以这种样式重新编写所有现有的路由代码,或者仅将我定义的部分(任何“/xyz/*”[](我的中间件xyz路由))替换为这种语法?我刚刚更新了答案。只需将需要中间件的路由放在一个单独的defroutes中。这对我不起作用。在您的示例中,如果我向发送请求。如果db/blahblahblah在db-routes中没有/blahblahblah,它仍然会首先调用中间件,然后检查db-routes中的路由,如果没有找到,则返回404。你是对的。compojure无法解决这个问题。我回到原来的答案。您将只需要对由DB包装的路由使用comporoute,如示例中所示,并可能将其余路由留给compojure。在本例中:demo with abd:demo with keyword params意味着什么?