2016-06-15 6 views
0

休暇中に新しいペデスタルインターセプタを実行することを希望します。コンテキストを変更して、各HTMLページのベースにトークン文字列を追加したいとします( 'site alive'レポートで使用するため)。ペデスタルでインターセプタを作成するための 'after'関数の使用方法

ペデスタルソースコード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' スコープではありません。

は、私のような何かをしたいですか?ありがとう。

+0

あなたはあなたのルートでインターセプタを「インストール」する必要があります。コードの一部を表示できますか? – ClojureMostly

答えて

1

after文書でこれが明確です。

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

あなたfその最初の引数としてcontextを受け取ることになります。 fの最初の引数を使用して、fの中のcontextにアクセスできます。 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

h/afterを呼び出すことにより、h/afterに供給し、h/after戻りインターセプタので、私は「私のトークン・インターセプター」を作成しますtoken-function、下記

f機能のサンプルですそれは価値があるので、我々はもはや 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)}) 
関連する問題