【发布时间】:2023-08-23 10:26:01
【问题描述】:
我正在尝试编写一个中间件,用于将请求中的所有字符串对象 id 转换为 ObjectId 对象。
我正在使用以下方法实现这一点:
(defn get-object-id
[id]
(when (and (string? id) (re-matches object-id-regex id))
(ObjectId. id)))
(defn maybe-obj->object-id [obj]
(or (get-object-id obj) obj))
(defn- convert-string->object-ids [obj]
(cwalk/postwalk
(partial pcommon/maybe-obj->object-id) obj))
(defn warp-params-string->objectid
"convert strings to object ids"
[handler]
(fn [request]
(handler (update-in request [:params] convert-string->object-ids))))
这适用于 json 的所有参数,请求参数等。但这不适用于路由参数,例如:fst 用于 url "/:fst"。我查看了 GET 宏,并且路由参数被注入到该宏的某处。但是,由于 GET/POST 等最后执行,我的中间件无权访问这些。任何优雅的方式来实现这一点。
【问题讨论】:
-
也许将
(handler (update-in request ...更改为(update-in (request handler) ...以便在返回的过程中而不是在返回的过程中获取参数? -
@noisesmith 这无济于事,因为我在处理我的 GET 请求时需要这些对象。
标签: clojure routes params middleware compojure