我希望在休假期间制作一个新的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'不在范围内?感谢。
答案 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)
对于它的价值,我们不再认为before
和after
函数是执行此操作的最佳方式。 (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)})