2013-02-11 16 views
6

Tôi nghĩ rằng tôi có một vấn đề khá đơn giản ở đây. Nhưng tôi đã nhìn vào màn hình này quá lâu. Vì vậy, tôi đang cố gắng (và thất bại) để có được các phiên nhà nước làm việc trong Compojure. Mã refheap dán is here.Làm thế nào để sử dụng lib-noir stateful-sessions trong Compojure

Bạn có thể thấy tôi đang cố gắng sử dụng lib-noir (dòng 62) để khởi tạo phiên trạng thái. Sau đó, khi ứng dụng đang chạy, tôi cố gắng thực hiện cuộc gọi đến session/put! một số dữ liệu trong phiên (dòng 43).

Bây giờ, stacktrace này nói rằng trong session.put !, lib-noir đang cố gắng trao đổi một phiên var mà không bị ràng buộc. Bây giờ, tôi nghĩ rằng tôi đã làm điều đó trên dòng 62. Vì vậy, tôi chắc chắn đây là một sửa chữa đơn giản mà một bộ mắt sẽ thấy.

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) 

Thanks

+0

Bạn đã bao giờ tìm thấy giải pháp cho vấn đề này chưa? Tôi đã phải đối mặt với cùng một vấn đề và bắt đầu một chủ đề, nhưng cũng không nhận được bất kỳ phản hồi nào. – dizzystar

Trả lời

0

I think you want wrap-noir-session, không phải wrap-noir-session*. Các tài liệu trên wrap-noir-session* nói (tôi nhấn mạnh) "Một lớp stateful xung quanh quấn phiên. hy vọng rằng wrap-session đã được sử dụng."

Nếu bạn muốn sử dụng wrap-noir-session* Tôi nghĩ rằng bạn sẽ cần phải sử dụng wrap-session một cách rõ ràng.

+0

Cảm ơn bạn đã trả lời. Vâng, tôi chắc chắn đã thử cả hai và không có asterix. Tôi thậm chí đã cố gắng loại bỏ các cuộc gọi cho bạn bè/xác thực. Vì vậy, các ứng dụng def trông giống như: '(def ứng dụng (handler/trang web (phiên/wrap-noir-phiên * app-tuyến đường))'. Nhưng tôi vẫn nhận được cùng một ** Var $ Unbound ** lỗi.Vì vậy, về cơ bản, một số nguyên tử phiên không bị ràng buộc khi tôi gọi gói-noir-session. Vì vậy, tôi đang tìm kiếm câu thần chú đúng. – Nutritioustim

2

Giải đáp của James Reeves tại - https://groups.google.com/forum/#!topic/compojure/yG6nCXiEinU

Hãy thử trao đổi xung quanh xử lý/trang web và quấn-noir-session *. Vì trình xử lý áp dụng phần mềm trung gian gói phiên và gói-noir-phiên * tùy thuộc vào tài liệu đó, nên sử dụng trình xử lý trước khi gói-noir-phiên.

  • James
0

Đưa xuống câu trả lời của tôi như tôi tiếp tục đến câu hỏi này và quên nó được giải quyết.

(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)) 
Các vấn đề liên quan