Fre*_*001 2 binding clojure compojure compojure-api
如何在compojure中绑定动态变量?请参阅下面的示例,这里request-id是为每个api请求生成的唯一uuid.我希望能够访问该请求ID在随后的方法记录等等.我已经使用绑定功能试过,但我仍然无法访问请求ID的some-page/some-method.
handler.clj
(ns some_app.handler
(:require
[compojure.api.sweet :refer :all]
[compojure.route :as route]
[some_api.some_page :as some-page]))
(def ^:dynamic *request-id*
nil)
(defn ^:private generate-request-id []
(str (java.util.UUID/randomUUID)))
(def app
(binding [*request-id* (generate-request-id)]
(api
(context "/api" [] (GET "/some-page" [] (some-page/some-method))))))
Run Code Online (Sandbox Code Playgroud)
一些-page.clj
(ns some_app.some_page
(:require
[clojure.tools.logging :as log]))
(def some-method []
(log/info {:request-id *request-id*}))
Run Code Online (Sandbox Code Playgroud)
这里对绑定的调用是在错误的地方.处理请求时绑定应该有效,而不是在构建app/api时.
你想要一些中间件来做到这一点:
(defn with-request-id
[f]
(fn [request]
(binding [*request-id* (generate-request-id)]
(f request)))
(def app
(with-request-id
(api ... ))
Run Code Online (Sandbox Code Playgroud)
另请参阅Ring Concepts
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |