Clojure compojure 中间件和箭头语法

Clojure compojure middleware and arrow syntax

我正在尝试了解 compojure 中间件 :

以下代码来自compojure template:

(def app
  (wrap-defaults app-routes site-defaults))

是否等同于下面的?

(def app
  (-> app-routes
      (wrap-defaults api-defaults)))

我不确定这一点,因为在下面的代码中 my-middleware2my-middleware1

之前被调用
(def app
  (-> api-routes
      (wrap-defaults api-defaults)
      (my-middleware1)
      (my-middleware2)))

你是对的:

(def app
  (wrap-defaults app-routes site-defaults))

相当于:

(def app
  (-> app-routes
      (wrap-defaults api-defaults)))

箭头称为 Thread-First Macro 并允许您以线性方式编写嵌套的 s 表达式。

在您的第二个示例中,当 HTTP 请求进入时,my-middleware2my-middleware1 之前调用是有意义的。您正在创建一个 Ring Handler,而不是直接调用中间件。

(def app
  (-> api-routes
    (wrap-defaults api-defaults)
    my-middleware1
    my-middleware2))

扩展为:

(def app
  (my-middleware2 (my-middleware1 (wrap-defaults app-routes api-defaults))))

当一个 HTTP 请求进来时,my-middleware2 首先处理它,对它做一些事情(即提取会话数据),然后将它传递给下一个中间件,直到其中一个 returns HTTP 响应。

注意:我从(my-middleware1)(my-middleware2)中取出了parens。当这样使用时,它意味着 my-middlware1 是一个函数,当不带参数调用时,returns 是一个中间件函数。这可能是您想要的,但不常见。