Liberator 的 Clojure defresource 参数 arity 错误

Clojure defresource argument arity error with Liberator

我正在编写一个 clojure 函数,当我使用 defn 定义它时它工作正常,但是当我使用 defresource 定义它时它会抛出 arity 错误。我怀疑这与我使用的 :as-response 键有关,但我不知道如何修复它。 有任何想法吗? 我的代码:

(defn function-name []
  :allowed-methods [:get]
  :available-media-types ["application/json"]
  :as-response (my function is here))

使用 defresource 时出错:"Wrong number of args (2) passed to ... " 我传递了 0 个参数,使用 defn 可以正常工作。

你定义的defn相当于

(defn function-name 
  []
  (do
    :allowed-methods 
    [:get]
    :available-media-types 
    ["application/json"]
    :as-response 
    (...)))

由于 do 表达式的值是表达式中的最后一个形式——关键字和向量没有任何副作用——函数定义等同于

(defn function-name 
  []
  (...))

你拥有的是一个 0 参数元数函数。 :as-response 和其他关键字/向量什么都不做。

查看 documentation for Liberator, the library expects a 2-parameter arity function when using :as-response. Also according to the documentation on resources 如果您想要参数化资源,只需将参数向量传递给 defresource。所以你的资源应该定义

(defresource function-name
  :allowed-methods [:get]
  :available-media-types ["application/json"]
  :as-response (fn [d ctx] ...))