我正在尝试编写一个中间件,用于将请求中的所有字符串对象 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 for url "/:fst"。我查看了 GET 宏,并且路由参数被注入到该宏的某处。但是,由于 GET/POST 等最后执行,我的中间件无权访问这些。任何优雅的方式来实现这一点。