确保在 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' 获取与键关联的值或默认值(如果关键是它不在地图上。