我目前正在使用鲁米努斯模板和+swagger选项,它添加了compojure支持。
我目前的设置是这样的(只有相关的位):
(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测试这些路由,"/login"路由运行良好。但是,完全相似的"/login2"返回
{
"errors": "(not (map? nil))"
}当我切换两个服务组的顺序时,结果与预期的一样:第一条路由运行良好,而第二条路由将不接收body。
这是Compojure-api本身的一个bug吗?我能做些什么来解决这个问题吗?
发布于 2017-01-12 20:33:07
defapi宏似乎包装了到api-middleware (签出编写-api源代码)的所有路由,其中包括wrap-params中间件。在您的设置中,您将两组路由链接在一起,它们都包装在api-middleware中,因此,在第二个defapi路由(/login2)发生两次的情况下,将对请求调用wrap-params中间件。wrap-params的第一个调用正确地解析了params,但是第二个wrap-params调用没有什么可处理的,因此您的代码以运行时错误告终。
要解决您的问题,尝试禁用默认包装由api-middleware对您的所有defapi使用,但只有一个。请参阅上面链接中的:disable-api-middleware选项。
https://stackoverflow.com/questions/40258311
复制相似问题