2016-06-15 2 views
0

Я хочу сделать новый перехватчик пьедестал, который будет запускаться на этапе ухода. Я хочу изменить контекст, чтобы добавить строку токена в базу каждой страницы html (для использования в отчетах «site alive»).Как использовать функцию «после» для создания перехватчика в пьедестале

Из исходного кода Пьедестал 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

Вам нужно «установить» перехватчик в маршрутах. Можете ли вы показать эту часть своего кода? – ClojureMostly

ответ

1

after Док ясно это.

(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 возвращает перехватчика, я создаю «мой-токенов перехватчик» по телефону 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

Для что это стоит, мы больше не считаем, что функции 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)}) 
Смежные вопросы