Clojure compojure中间件和箭头语法

时间:2015-01-12 00:28:14

标签: clojure compojure

我试图了解compojure中间件:

以下代码来自compojure template

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

它是否等同于以下内容?

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

我不确定这一点,因为在my-middleware2

之前调用了以下代码my-middleware1
(def app
  (-> api-routes
      (wrap-defaults api-defaults)
      (my-middleware1)
      (my-middleware2)))

1 个答案:

答案 0 :(得分:3)

你是对的:

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

相当于:

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

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

在第二个示例中,当{HTTP}请求进入时,my-middleware2之前调用my-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首先处理它,对它做一些事情(即提取会话数据),然后将其传递给下一个中间件,直到其中一个返回HTTP响应。 / p>

注意:我从(my-middleware1)(my-middleware2)中取出了parens。当这样使用时,它意味着my-middlware1是一个在没有参数的情况下调用时返回中间件函数的函数。这可能是你想要的,但不是常见的做法。