确保在Clojure中绑定var

时间:2015-02-17 07:31:05

标签: clojure nullpointerexception ring

在我的中间件中,我正在检查: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,因此使用此中间件的内容如果未设置则返回NullPointerException。最好的方法是什么?

2 个答案:

答案 0 :(得分:5)

使用when-let 或类似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))))

答案 1 :(得分:2)

响铃请求只是地图,所以你可以使用'包含?'查看它是否包含特定键,或者“获取”获取与键关联的值,如果键不在地图中,则为默认值。