Clojure 在中间件阶段访问路由参数

Clojure 在中间件阶段访问路由参数,clojure,routes,params,middleware,compojure,Clojure,Routes,Params,Middleware,Compojure,我正在尝试编写一个中间件,用于将请求中的所有字符串对象ID转换为ObjectId对象 我通过以下方式实现这一目标: (defn获取对象id [id] (当(和(字符串?id)(重新匹配对象id正则表达式id)) (ObjectId.id))) (定义对象->对象id[obj] (或(获取对象id obj)obj) (defn-转换字符串->对象ID[obj] (cwalk/postwalk) (部分PComon/maybe obj->object id)obj) (定义扭曲参数字符串->对象ID

我正在尝试编写一个中间件,用于将请求中的所有字符串对象ID转换为ObjectId对象

我通过以下方式实现这一目标:

(defn获取对象id
[id]
(当(和(字符串?id)(重新匹配对象id正则表达式id))
(ObjectId.id)))
(定义对象->对象id[obj]
(或(获取对象id obj)obj)
(defn-转换字符串->对象ID[obj]
(cwalk/postwalk)
(部分PComon/maybe obj->object id)obj)
(定义扭曲参数字符串->对象ID)
“将字符串转换为对象ID”
[处理程序]
(fn[请求]
(处理程序(在请求中更新[:params]转换字符串->对象ID)))

这适用于json、请求参数等的所有参数,但不适用于路由参数,例如:fst for url“/:fst”。我查看了GET宏,路由参数被注入到该宏的某个地方。然而,由于GET/POST等是最后执行的,所以我的中间件无法访问这些。实现这一点的任何优雅方式。

那些
/:foo/:bar
-样式参数由于URI上的模式匹配而绑定到各个路由定义中指定的模式。外层甚至不知道图案是什么样子。因此,不可能将这些处理提升到中间件

相反,您可以编写一个宏,比如说带有预处理参数的
,来包装路由处理程序的主体。如果它最终在许多处理程序中都很有用,那么您还可以提供自己版本的
GET
&Co,将主体包装在param处理宏中,委托给Compojure的宏


如果您希望在中间件的进一步层中使用此预处理的结果,那么这并不是一个好的解决方案。在这种情况下,假设您愿意将匹配的实际URI路径段保留到核心处理程序层,您可以在中间件中执行其他参数类型的预处理,然后使用
GET
&Co.变量仅预处理路由参数。

可能更改
(处理程序(在请求中更新…
(在(请求处理程序)中更新…
以便在返回的过程中获取参数,而不是在返回的过程中获取参数?@noisesmith这没有帮助,因为我在处理get请求时需要这些对象。这很有意义。还与James Reeves进行了交谈。有关线程的更多上下文: