【问题标题】:Howto use lib-noir stateful-sessions in Compojure如何在 Compojure 中使用 lib-noir 状态会话
【发布时间】:2014-09-11 10:14:42
【问题描述】:

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

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

现在,这个堆栈跟踪表明在 session.put! 中,lib-noir 正在尝试换出尚未绑定的会话变量。现在,我想我是在第 62 行做的。所以我确信这是一个简单的修复,另一组眼睛会看到。

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

谢谢

【问题讨论】:

  • 你有没有找到解决这个问题的方法?我一直面临同样的问题并开始了一个线程,但也没有得到任何回复。

标签: web-applications clojure compojure noir


【解决方案1】:

由 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 之前应用。

  • 詹姆斯

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复。是的,我确实尝试过使用和不使用asterix。我什至尝试删除对朋友/身份验证的呼叫。所以应用程序定义看起来像:(def app (handler/site (session/wrap-noir-session* app-routes))。但我仍然得到相同的 Var$Unbound 错误。所以基本上,当我调用 wrap-noir-session 时,一些会话原子没有被绑定。所以我正在寻找正确的咒语。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 2019-02-16
      • 2011-04-21
      • 2013-11-02
      • 2014-05-12
      • 2010-11-09
      • 2013-08-02
      • 2014-11-25
      • 1970-01-01
      相关资源
      最近更新 更多