clojure - 更具可读性的 Compojure 路线

标签 clojure routes compojure ring

我正在开发一个小型 Ring/Compojure web 应用程序,我想知道是否有一种方法可以整理路线。我正在使用标准 Clojure 解构,但需要相当多的参数传递给函数。

这没问题,使用 Compojure Compojure 特定的解构:

(POST "/login/" [email password] (login-post email password)) ; handle login attempt

现在情况开始变得更糟。我需要为该函数提供存储在 session 中的即时消息和电子邮件:

(GET "/login/" {flash :flash {email :email} :session} (login-get flash email))

以下是通过表单提交数据的途径:

(POST "/" {{user-email :user-email} :session {title :title} :params {tags :tags} :params { content :content } :params { privacy :privacy } :params} (home-post user-email title tags content privacy))

我知道我可以使用 :params 将原始请求发送到 home-post 函数,但我不知何故觉得将参数提取与路由一起放置是一个更好的解决方案。它使主帖更加纯粹并且更容易测试。而不是仅仅为每个函数提供一个巨大的请求映射。

路线定义中的解构是否可以更清晰(更具可读性),使用某种从 map 中提取的函数、宏或任何东西来进行FX?

将解构与路由一起放置的优点和缺点?

最佳答案

首先,我同意您的评估,即请求解构通常属于路由处理程序定义。 Compojure 提供的事实an extension of Clojure's destructuring syntax看来作者也有类似的感受。

您可以采取一些措施来减少解构形式中的重复。一、Clojure的标准map binding destructuring将为您发布的最后一条路线提供帮助。您可以做的第一件事是合并从请求中提取的 key :params:

(POST "/" {{title :title, tags :tags, content :content, privacy :privacy} :params ...} ...)

这更清晰一些,但由于您没有重命名从 :params 中提取的任何值,因此您可以做得更好:

(POST "/" {{:keys [title tags content privacy]} :params ...} ...)

这就是 Clojure 解构语法所能达到的程度,但是您可以利用 Compojure 的附加解构语法来进一步简化它。 Compojure 假设您最常对从请求的 :params 键获取值感兴趣,因此您可以使用向量解构来提取它们:

(POST "/" [title tags content privacy] ...)

好多了。由于您仍然需要从请求中获取其他值,因此您可以在绑定(bind)向量末尾提供 :as the-request 来直接访问请求:

(POST "/" [title tags content privacy :as req] ...)

但是请记住,该变量可以被解构。考虑到所有这些,这是您上一条路线的简化版本:

(POST "/" [title tags content privacy :as {{user-email :user-email} :session}]
  (home-post user-email title tags content privacy))

希望这对您有所帮助!您编写的 Clojure 越多,您就能找到更多简化代码以使其更清晰、更简洁的方法。

关于clojure - 更具可读性的 Compojure 路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25446717/

相关文章:

java - 从 Java 调用 Clojure 抛出不包含堆栈跟踪的 NullPointerException

ruby-on-rails - 布线 Rack 的问题

clojure - Compose + Swagger 具有基本身份验证

clojure - 如何在 Compojure/Ring 中区分 html 与 xhr/xml/json 请求?

javascript - 使用快速路由显示React页面

clojure - 莱因环服务器 : "That' s not a task"

clojure - 有没有一种方法可以像 Clojure 中那样在 Common Lisp 中使用关键字作为函数?

clojure - 如何将 clojure 数字字符串转换为单独的整数?

clojure - 在 clojure 中删除重复项

javascript - 使用 AngularJS 单击内容选项卡路由到不同页面