Clojure Compojure环中间件如何使用中间件之外的价值

Clojure Compojure环中间件如何使用中间件之外的价值,clojure,middleware,compojure,ring,Clojure,Middleware,Compojure,Ring,我使用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-someth

我使用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并失败


我试图完成的是将返回的用户传递回,以便以后使用它。我没有任何运气,因为我真的不知道我会在哪里尝试添加它,我可以访问它以后。我已经试着用
请求
将它关联起来,但似乎以后无法访问它。理想的情况是,我能够将其传递给
使用用户做点什么
功能。

使用
assoc
向请求中添加一些数据应该完全有效

您可以找到一个示例,其中包含一些非常接近于我在生产中使用的代码

本质上,中间件调用

(handler (assoc request
                :validation {:valid true
                             :validation valid?}))
因此,对于您的情况,以下几点应该是有效的:

(handler (assoc request
                :user user))
如果我理解正确,您使用的解构语法来自。根据上的示例,我认为通过
:middleware
键设置的中间件的行为与预期的一样,您应该能够从最终到达您的路径的
请求中提取
: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))

它应该包含
:user
您在中间件函数中关联到它的
代码。请注意
请求
周围缺少的括号,如本答案注释中所述。

使用
assoc
向请求添加一些数据应该完全有效

您可以找到一个示例,其中包含一些非常接近于我在生产中使用的代码

本质上,中间件调用

(handler (assoc request
                :validation {:valid true
                             :validation valid?}))
因此,对于您的情况,以下几点应该是有效的:

(handler (assoc request
                :user user))
如果我理解正确,您使用的解构语法来自。根据上的示例,我认为通过
:middleware
键设置的中间件的行为与预期的一样,您应该能够从最终到达您的路径的
请求中提取
: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))

它应该包含
:user
您在中间件函数中关联到它的
代码。请注意
请求
周围缺少括号,如本答案注释中所述。

我已尝试将其与请求关联起来。。。我已经成功地做到了这一点。你能告诉我你是怎么做的,以及你以后是怎么访问它的吗?我已经试着把它和请求关联起来了。。。我已经成功地做到了这一点。您能展示一下您是如何尝试这样做的,以及您以后是如何尝试访问它的吗?谢谢,这是有效的,但我必须(发布“/worlds”请求…在[]之外。不知道为什么会出现错误。啊,这很微妙,我没有看到。抱歉。您可以在compojure.api项目中找到用于解构的文档来重新实现它。请参阅(前面评论中缺少的链接)更新了答案并删除了方括号。谢谢,这很有效,但我不得不这样做(发布“/worlds”请求…在[]之外。不知道为什么否则我会得到错误。啊,这很微妙,我没有看到。抱歉。你可以在compojure.api项目中找到用于解构的文档,它重新实现了这一点。请参阅(前面评论中缺少的链接)更新了答案并删除了括号。