【问题标题】:Compojure Ring Middleware How To Use Value Outside of MiddlewareCompojure Ring 中间件如何在中间件之外使用价值
【发布时间】:2019-01-15 04:18:38
【问题描述】:

我有一个简单的路由和中间件设置,其中包含使用环形中间件的 compojure/swagger。

(POST "/worlds" [request]
      :body-params [name :- String]
      :header-params [token :- String]
      :middleware [wrap-api-auth]
      :summary "Creates a new world with 'name'"
      (ok (do-something-with-user)

(defn wrap-api-auth [handler]
  (fn [request]
    (let
      [token (get (:headers request) "token")
       user (db/get-user-by-token token)]
      (if user
        (handler request)     ; pass to wrapped handler
        (unauthorized {:error "unauthorized"})))))

这定义了一个带有一些基本身份验证的简单路由。头参数中传递的令牌用于进行数据库查询,该查询要么返回用户并继续,要么返回 false 并失败。

我想要完成的是将返回的用户传回,以便我以后可以使用它。我没有运气,因为我真的不知道我会在哪里尝试将它添加到我以后可以访问它。我试过用requestassoc 它,但我以后似乎无法访问它。理想的情况是我能够将它传递给do-something-with-user 函数。

【问题讨论】:

  • 我已经尝试将它与请求相关联......我已经成功地做到了这一点。您能说明您是如何尝试这样做的,以及您以后如何尝试访问它吗?

标签: clojure middleware compojure ring


【解决方案1】:

使用assoc 向请求中添加一些数据应该完全可以工作。

你可以在https://gist.github.com/ska2342/4567b02531ff611db6a1208ebd4316e6#file-gh-validation-clj-L124找到一个与我在生产中的代码非常接近的示例

本质上,该中间件调用

(handler (assoc request
                :validation {:valid true
                             :validation valid?}))

所以对于你的情况,以下应该只是工作:

(handler (assoc request
                :user user))

如果我理解正确,您使用的解构语法来自compojure-api。根据https://github.com/metosin/compojure-api/wiki/Middleware 的示例,我想说通过:middleware 键设置的中间件的行为与预期的一样,您应该能够从request 中提取:user,最终在您的路线中结束。

所以,只需将request 传递给do-something-with-user 函数:

(POST "/worlds" request
      :body-params [name :- String]
      :header-params [token :- String]
      :middleware [wrap-api-auth]
      :summary "Creates a new world with 'name'"
      (ok (do-something-with-user request))

它应该在你的中间件函数中包含:userassoced。请注意 request 周围缺少的括号,就像这个答案的 cmets 中提到的那样。

【讨论】:

猜你喜欢
  • 2018-12-27
  • 2013-01-31
  • 2013-07-18
  • 2014-10-10
  • 2011-04-21
  • 2012-12-31
  • 2023-03-28
  • 2014-11-25
  • 1970-01-01
相关资源
最近更新 更多