我目前正在使用带有+ swagger选项的Luminus模板,它增加了compojure-api支持。
我目前的设置是这样的(只有相关位):
(ns my-project.routes.services
(:require [compojure.api.sweet :refer :all]
,,,)
(defapi service-routes
(POST "/login" req
:return Result
:body [user UserLogin]
:summary "Log the user in"
(auth/login! req user))
(defapi restricted-service-routes
(POST "/login2" req
:return Result
:body [user UserLogin]
:summary "Log the user in"
(auth/login! req user)))
和
(ns my-project.handler)
(:require [my-project.routes.services :refer :all])
(defroutes app-routes
#'service-routes
#'restricted-service-routes)
当服务器收到请求时,会将其传递给app-routes
。
然后我使用Swagger UI测试这些路由,"/login"
路由工作
精细。但是,完全相似的"/login2"
会返回
{
"errors": "(not (map? nil))"
}
当我切换两个服务组的顺序时,结果如预期:第一条路线正常,第二条路线不接收body
。
这是Compojure-api本身的错误吗?我能做些什么来解决这个问题吗?
答案 0 :(得分:0)
defapi
宏似乎将所有路由包含到api-middleware
(请查看compojure-api source code),其中包含wrap-params
中间件。
在您的设置中,您链接了两组包含在api-middleware
中的路由,因此在第二个wrap-params
路由(/ login2)两次的情况下,请求调用defapi
中间件。 wrap-params
的第一次调用正确解析了params,但第二次wrap-params
调用无需处理,因此您的代码最终会出现运行时错误。
要解决您的问题,请尝试按api-middleware
为所有defapi
用法禁用默认包装,但只能使用一个。{1}}。请参阅上面链接中的:disable-api-middleware
选项。