Clojure Ring:如何在中间件中修改会话

Clojure Ring:如何在中间件中修改会话,clojure,middleware,ring,Clojure,Middleware,Ring,如何在环形中间件中修改会话?我基本上希望有一个被访问的URL的历史记录存储在那里,但我就是不能让会话存储值 会话在代码的其他地方正常工作,我可以在那里返回响应。我想这与这个问题有关,我不了解中间件是如何工作的 这是我目前的代码 (defn wrap-history [handler]

如何在环形中间件中修改会话?我基本上希望有一个被访问的URL的历史记录存储在那里,但我就是不能让会话存储值

会话在代码的其他地方正常工作,我可以在那里返回响应。我想这与这个问题有关,我不了解中间件是如何工作的

这是我目前的代码

(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))))