Clojure compojure 中间件和箭头语法

标签 clojure compojure

我正在尝试理解 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-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/

相关文章:

clojure - 解构形式和组合?

Clojure ring wrap-json-params 弄乱了 JSON 数组

clojure - 使用Clojure中的自定义方法漂亮地打印记录

json - 如何在 compojure 处理程序中获取 selflink?

session - 复合/环 : Why doesn't a session with cookie-store survive a server restart?

reflection - 如何将 clojure 的 doc 函数应用于一系列函数

clojure - 无法从 compojure 中的 POST 请求中提取多部分参数

Clojure命名空间: method to see defined objects?

emacs - 在开发基于 compojure/ring 的应用程序时使用 emacs/cider 的正确方法是什么?

clojure - 从 incanter 数据集中获取列序列的惯用方法是什么?