6

我想我在这里有一个相当简单的问题。但我一直在看这个屏幕太久了。所以我正在尝试(但失败)让有状态的会话在 Compojure 中工作。重新堆代码粘贴在这里

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

现在,这个堆栈跟踪表明在 session.put! 中,lib-noir 正在尝试换出一个尚未绑定的会话变量。现在,我想我是在第 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)

谢谢

4

3 回答 3

2

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

尝试交换处理程序/站点和 wrap-noir-session*。因为 handler/site 应用了 wrap-session 中间件,并且 wrap-noir-session* 依赖于文档,所以 handler/site 应该在 wrap-noir-session 之前应用。

  • 詹姆士
于 2013-11-09T06:04:24.780 回答
0

我想你想要wrap-noir-session,不是wrap-noir-session*。上的文档wrap-noir-session*说(我的重点)“围绕 wrap-session 的有状态层。预计 wrap-session 已被使用。

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

于 2013-02-12T03:14:21.780 回答
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))
于 2014-09-11T02:14:42.803 回答