如何在Compojure中使用lib-noir有状态会话

时间:2013-02-11 04:51:10

标签: web-applications clojure compojure noir

我想我在这里有一个相当简单的问题。但我一直在看这个屏幕太久了。所以我正在尝试(并且失败)在Compojure中使用有状态会话。重新生成代码粘贴 is here

您可以看到我尝试使用lib-noir(第62行)来初始化有状态会话。然后当应用程序运行时,我尝试在会话中调用session/put!一些数据(第43行)。

现在,这个堆栈跟踪说在session.put!中,lib-noir正在尝试交换未绑定的会话var。现在,我以为我在第62行做到了。所以我确信这是一个简单的解决方案,另一组眼睛会看到。

java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to clojure.lang.Atom                                                                                                                                                                                                                                                                                                                                
        at clojure.core$swap_BANG_.invoke(core.clj:2110)                                                                                                                                                                                                                                                                                                                                                                  
        at noir.session$put_BANG_.invoke(session.clj:18)                                                                                                                                                                                                                                                                                                                                                                  
        at bkell.http.handler$fn__6159.invoke(handler.clj:156)                                                                                                                                                                                                                                                                                                                                                            
        at compojure.core$make_route$fn__3800.invoke(core.clj:93)                                                                                                                                                                                                                                                                                                                                                         
        at compojure.core$if_route$fn__3784.invoke(core.clj:39)                                                                                                                                                                                                                                                                                                                                                           
        at compojure.core$if_method$fn__3777.invoke(core.clj:24)                                                                                                                                                                                                                                                                                                                                                          
        at compojure.core$routing$fn__3806.invoke(core.clj:106)                                                                                                                                                                                                                                                                                                                                                           
        at clojure.core$some.invoke(core.clj:2390)                                                                                                                                                                                                                                                                                                                                                                        
        at compojure.core$routing.doInvoke(core.clj:106)                                                                                                                                                                                                                                                                                                                                                                  
        at clojure.lang.RestFn.applyTo(RestFn.java:139)                                                                                                                                                                                                                                                                                                                                                                   
        ...
        at java.lang.Thread.run(Thread.java:619)

谢谢

3 个答案:

答案 0 :(得分:2)

James Reeves在https://groups.google.com/forum/#!topic/compojure/yG6nCXiEinU

回答
  

尝试在处理程序/站点和wrap-noir-session *之间进行交换。因为   handler / site应用wrap-session中间件,和   wrap-noir-session *取决于根据文档,   应该在wrap-noir-session之前应用handler / site。

     
      
  • 詹姆斯
  •   

答案 1 :(得分:0)

我认为您需要wrap-noir-session,而不是wrap-noir-session*。关于wrap-noir-session*的文档说(我的重点)“围绕包装会话的有状态层。期待已经使用了包装会话。

如果您想使用wrap-noir-session*,我认为您需要明确使用wrap-session

答案 2 :(得分:0)

当我不断回答这个问题并忘记它已经解决时,放下我的答案。

(ns my-project.handler
    (:require (compojure [handler :as handler]
                         [route :as route]
                         [core :refer :all])
              [noir.util.middleware :as middleware]
              [noir.session :as session]))

(defroutes my-routes
  (GET "/put" req (session/put! :test "yes"))
  (GET "/get" req (session/get :test))
  (route/resources "/")
  (route/not-found "Not Found"))

(def app
  (-> 
   (handler/site my-routes)
    session/wrap-noir-flash ; only if you need flash-put! and flash-get
    session/wrap-noir-session))