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

Nut*_*tim 6 web-applications clojure compojure noir

我想我在这里有一个相当直接的问题.但我一直在看这个屏幕太久了.所以我正在尝试(并且失败)在Compojure中使用有状态会话.refheap代码粘贴在这里.

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

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

__CODE__.例如:

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)
Run Code Online (Sandbox Code Playgroud)

显然,__CODE__如果您要为不同的注释类型调用不同的segue,则可以检查与之关联的注释类型等.

当然,如果你想像__CODE__往常一样将任何信息传递给下一个场景.

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)
Run Code Online (Sandbox Code Playgroud)

如您所见,我将__CODE__对象传递给下一个视图.如果JSON结构中的其他字段与每个注释相关联,则一个简单的解决方案是将属性添加到与要跟踪的每个字段关联的自定义视图中.只需转到.h作为注释自定义类并添加所需的属性.然后,当您创建自定义注释(要添加到地图)时,也可以设置这些属性.然后,当您将此注释传递给下一个视图控制器时,所有所需的属性都将在那里可用.


显然,如果您正在使用NIB,只需执行任何您想要的NIB等效实例化下一个视图控制器,设置您想要的任何属性,并推送到它或以模态方式呈现它,例如:

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)
Run Code Online (Sandbox Code Playgroud)

小智 0

我想你想要wrap-noir-session,不是wrap-noir-session*。文档上wrap-noir-session*说(我的重点)“围绕包装会话的有状态层。期望包装会话已经被使用。

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