我正在尝试理解 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-middleware1
之前调用 my-middleware2
是有意义的。您正在创建一个 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
首先处理它,对其执行某些操作(即提取 session 数据),然后将其传递给下一个中间件,直到其中一个中间件返回HTTP 响应。
注意:我从 (my-middleware1)
和 (my-middleware2)
中取出了括号。当这样使用时,这意味着 my-middlware1 是一个函数,当不带参数调用时,返回一个中间件函数。这可能是您想要的,但并不常见。
关于Clojure compojure 中间件和箭头语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27893719/