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-middleware2
在 my-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-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
首先处理它,对它做一些事情(即提取会话数据),然后将它传递给下一个中间件,直到其中一个 returns HTTP 响应。
注意:我从(my-middleware1)
和(my-middleware2)
中取出了parens。当这样使用时,它意味着 my-middlware1
是一个函数,当不带参数调用时,returns 是一个中间件函数。这可能是您想要的,但不常见。
我正在尝试了解 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)))
你是对的:
(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
首先处理它,对它做一些事情(即提取会话数据),然后将它传递给下一个中间件,直到其中一个 returns HTTP 响应。
注意:我从(my-middleware1)
和(my-middleware2)
中取出了parens。当这样使用时,它意味着 my-middlware1
是一个函数,当不带参数调用时,returns 是一个中间件函数。这可能是您想要的,但不常见。