如何使用 'after' 函数在 Pedestal 中创建拦截器

How to use 'after' function to create interceptor in Pedestal

我希望在离开阶段制作一个新的基座拦截器 运行。我希望修改上下文以将标记字符串添加到每个 html 页面的底部(用于 'site alive' 报告)。

来自Pedestal源代码here我看到这个函数:

(defn after
 "Return an interceptor which calls `f` on context during the leave
 stage."
 ([f] (interceptor {:leave f}))
 ([f & args]
    (let [[n f args] (if (fn? f)
                    [nil f args]
                    [f (first args) (rest args)])]
      (interceptor {:name (interceptor-name n)
                 :leave #(apply f % args)}))))

所以我需要为它提供一个函数,然后将其插入到拦截器映射中。这就说得通了。但是,当 'context' 不在范围内时,如何编写引用上下文的函数?

我想做这样的事情:

...[io.pedestal.interceptor.helpers :as h]...

(defn my-token-interceptor []
  (h/after
    (fn [ctx]
      (assoc ctx :response {...}))))

但是'ctx'不在范围内?谢谢

after 文档对此很清楚。

(defn after
 "Return an interceptor which calls `f` on context during the leave
 stage."

您的 f 将收到 context 作为其第一个参数。您可以使用 f 的第一个参数在 f 中访问 context

下面是 f 函数的示例:token-function,它将提供给 h/after 并且因为 h/after returns 拦截器,我创建'my-token-interceptor' 通过调用 h/aftertoken-function

...[io.pedestal.interceptor.helpers :as h]...

(defn token-function
  ""
  [ctx]
  (assoc ctx :response {}))

(def my-token-interceptor (h/after token-function))

;; inside above token-function, ctx is pedestal `context`

尽管如此,我们不再认为 beforeafter 函数是执行此操作的最佳方式。 (io.pedestal.interceptor.helpers 中的所有函数现在都没有必要了。)

我们的建议是像 Clojure 地图文字一样编写拦截器,如下所示:

(def my-token-interceptor
  {:name ::my-token-interceptor
   :leave (fn [context] (assoc context :response {,,,}))})

您可以看到 after 函数没有增加任何清晰度或解释性价值。

当然,您可以在映射中使用函数值,而不是在那里创建匿名函数:

(defn- token-function
  [context]
  (assoc context :response {,,,}))

(def my-token-interceptor
  {:name  ::my-token-interceptor
   :leave token-function)})