我试图了解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)))
答案 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
是一个在没有参数的情况下调用时返回中间件函数的函数。这可能是你想要的,但不是常见的做法。