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

时间:2016-06-15 15:07:50

标签: clojure pedestal

我希望在休假期间制作一个新的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)}))))

所以我需要为它提供一个函数,然后将其插入到拦截器映射中。那讲得通。但是,当“上下文”不在范围内时,如何编写此函数来引用上下文?

我希望做类似的事情:

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

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

但'ctx'不在范围内?感谢。

2 个答案:

答案 0 :(得分:1)

after doc对此很清楚。

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

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

下面的

f函数的示例:token-function,它将提供给h/after,因为h/after返回拦截器,我创建了一个' my -token拦截'通过h/after

致电token-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`

答案 1 :(得分:1)

对于它的价值,我们不再认为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)})