リクエスト内のすべての文字列オブジェクト 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 のすべてのパラメータ、リクエスト パラメータなどで機能します。しかし、これはルート パラメータには適用されません。たとえば、url "/:fst" の :fst です。GET マクロを調べたところ、ルート パラメータがそのマクロ内のどこかに挿入されています。ただし、GET/POST などは最後に実行されるため、私のミドルウェアはこれらにアクセスできません。これを達成するための優雅な方法。