Clojure Ring:如何在中间件中修改会话
如何在环形中间件中修改会话?我基本上希望有一个被访问的URL的历史记录存储在那里,但我就是不能让会话存储值 会话在代码的其他地方正常工作,我可以在那里返回响应。我想这与这个问题有关,我不了解中间件是如何工作的 这是我目前的代码Clojure Ring:如何在中间件中修改会话,clojure,middleware,ring,Clojure,Middleware,Ring,如何在环形中间件中修改会话?我基本上希望有一个被访问的URL的历史记录存储在那里,但我就是不能让会话存储值 会话在代码的其他地方正常工作,我可以在那里返回响应。我想这与这个问题有关,我不了解中间件是如何工作的 这是我目前的代码 (defn wrap-history [handler]
(defn wrap-history [handler]
(fn [req]
(handler (assoc-in req [:session :history]
(vec (concat (-> req :session :history) [(request/request-url req)]))))))
这是应用程序(我使用的是包含会话中间件的环默认值)
答案可能非常简单(可能与如何从中间件而不是请求返回响应有关),但我似乎无法找到正确的文档 好吧,我是对的,我误解了中间件的基本原理。我试图修改处理程序请求,而我应该修改返回的响应 这是包装历史的工作版本。它检查现有会话的请求和响应,因为会话也可以在中间件之前由其他代码修改
(defn wrap-history
"Middleware that stores last 20 visited urls in session"
[handler]
(fn [req]
(let [resp (handler req)
session (or (:session resp) (:session req))
updated-session (assoc session :history
(vec (take-last 20 (concat (:history session) [(request/request-url req)]))))]
(assoc resp :session updated-session))))
(defn wrap-history
"Middleware that stores last 20 visited urls in session"
[handler]
(fn [req]
(let [resp (handler req)
session (or (:session resp) (:session req))
updated-session (assoc session :history
(vec (take-last 20 (concat (:history session) [(request/request-url req)]))))]
(assoc resp :session updated-session))))