确保在 Clojure 中绑定了 var
Making sure a var is bound in Clojure
在我的中间件中,我正在检查 :session
的值以查看用户是否已登录。
如果设置了 :session
的值,效果会很好。虽然,我不确定检查 :session
是否绑定的最佳方法是什么。
(defn logged-in-verify
[ring-handler]
(fn new-ring-handler
[request]
;;verify that the scrypt hash of email and timestamp matches.
(let [session (:session request)
email (:ph-auth-email session)
token (:ph-auth-token session)
timestamp (:ph-auth-timestamp session)]
(if (scryptgen/check (str email timestamp) token)
(do
;; return response from wrapped handler
(ring-handler request))
;; return error response
{:status 400, :body "Please sign in."}))))
因为我不检查 :session
是否绑定,所以使用此中间件 return 和 NullPointerException
如果未设置。最好的方法是什么?
使用when-let
or the similar if-let
检查您是否真的有会话:
(defn logged-in-verify
[ring-handler]
(fn new-ring-handler
[request]
;;verify that the scrypt hash of email and timestamp matches.
(if-let [session (:session request)]
(let [email (:ph-auth-email session)
token (:ph-auth-token session)
timestamp (:ph-auth-timestamp session)]
(if (scryptgen/check (str email timestamp) token)
;; return response from wrapped handler
(ring-handler request))
;; return error response
{:status 400, :body "Please sign in."}))
;; do something when there is no session yet
(generate-new-session-and-redirect))))
环请求只是映射,因此您可以使用 'contains?' 查看它是否包含特定键,或使用 'get' 获取与键关联的值或默认值(如果关键是它不在地图上。
在我的中间件中,我正在检查 :session
的值以查看用户是否已登录。
如果设置了 :session
的值,效果会很好。虽然,我不确定检查 :session
是否绑定的最佳方法是什么。
(defn logged-in-verify
[ring-handler]
(fn new-ring-handler
[request]
;;verify that the scrypt hash of email and timestamp matches.
(let [session (:session request)
email (:ph-auth-email session)
token (:ph-auth-token session)
timestamp (:ph-auth-timestamp session)]
(if (scryptgen/check (str email timestamp) token)
(do
;; return response from wrapped handler
(ring-handler request))
;; return error response
{:status 400, :body "Please sign in."}))))
因为我不检查 :session
是否绑定,所以使用此中间件 return 和 NullPointerException
如果未设置。最好的方法是什么?
使用when-let
or the similar if-let
检查您是否真的有会话:
(defn logged-in-verify
[ring-handler]
(fn new-ring-handler
[request]
;;verify that the scrypt hash of email and timestamp matches.
(if-let [session (:session request)]
(let [email (:ph-auth-email session)
token (:ph-auth-token session)
timestamp (:ph-auth-timestamp session)]
(if (scryptgen/check (str email timestamp) token)
;; return response from wrapped handler
(ring-handler request))
;; return error response
{:status 400, :body "Please sign in."}))
;; do something when there is no session yet
(generate-new-session-and-redirect))))
环请求只是映射,因此您可以使用 'contains?' 查看它是否包含特定键,或使用 'get' 获取与键关联的值或默认值(如果关键是它不在地图上。