2

我正在将几个月前制作的旧 Web 应用程序从 Noir 转换为 Compojure,并且我正在使用 Lib-Noir 插件。看来会话/放置!要么以某种我不理解的方式进行了更改,要么出于某种原因而出现故障。

在这里,我可以看到4Clojure似乎可以毫无问题地使用它:参见第 51 行。我还发现这个线程涵盖了相同的问题,但似乎没有令人满意的回应。

这应该有效(黑色)

user=> (require '[noir.session :as sesh])
nil
user=> (sesh/put! :user "me")
ClassCastException clojure.lang.Var$Unbound cannot be cast to clojure.lang.Atom  
clojure.core/swap! (core.clj:2162)

以上是我在网页上查看的相同错误。基本上我被卡住了。

编辑以添加

似乎我对命令行部分造成了一些混淆:(put!)在程序中也不起作用。没什么可写的,除了它是 (shesh/put! :uname user) 并且看起来 :uname 不起作用。当我使用与以前相同的工具时,我很困惑为什么它以前会起作用而不是现在起作用。这是对我大约 6 个月前建立的网站的重写。我只是把它从 Noir 移到 Compojure。据我所知,lib-noir 会话与 Noir 中的会话基本相同。

另一个编辑

我把代码放在github上。这不是完成的项目,但希望有人能破译这里发生的事情:https ://github.com/dt1/SoloResume

4

2 回答 2

1

如果从 REPL 运行它,Noir 中没有注册浏览器会话。您可以使用绑定来模拟这一点:

(binding [sesh/*noir-session* (atom {:somekey "somevalue"})]
  (sesh/put! :user "borkdude"))

仅将其用于测试/模拟以查看会话映射中发生的情况,而不是在生产代码中。

于 2013-04-29T14:18:43.047 回答
0

一个相当老的问题,但在这里回答,因为这是我遇到同样问题时的第一个谷歌结果。我使用的是 compojure:1.1.6, ring:1.2.1 和 lib-noir:0.7.6

您需要在定义应用程序时使用 noir.session/wrap-noir-session - 例如:

(def app
  (-> (handler/site (routes app-routes ))
      session/wrap-noir-session
      wrap-base-url))

参考资料: https ://groups.google.com/d/msg/clojure/XXgSGhF912I/lu​​hN9wmMoi8J

于 2015-02-07T22:39:25.783 回答