Compojure-api 在第一组 API 路由之后删除 body-param
Compojure-api removes body-param after the first group of API routes
我目前正在使用带有 +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"
returns
{
"errors": "(not (map? nil))"
}
当我切换两个服务组的顺序时,结果如预期:第一个路由正常,而第二个不会收到body
。
这是 Compojure-api 本身的错误吗?我能做些什么来解决这个问题吗?
defapi
宏似乎将所有路由包装到 api-middleware
(查看 compojure-api source code),其中包括 wrap-params
中间件。
在您的设置中,您链接了两组路由,它们都包含在 api-middleware
中,因此在第二个 defapi
路由 (/login2) 的情况下,根据请求调用 wrap-params
中间件两次。 wrap-params
的第一次调用正确解析了参数,但第二次 wrap-params
调用没有任何要处理的内容,因此您的代码最终出现运行时错误。
要解决您的问题,请尝试通过 api-middleware
为所有 defapi
用法禁用默认换行,但只有一个。请参阅上面 link 中的 :disable-api-middleware
选项。
我目前正在使用带有 +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"
returns
{
"errors": "(not (map? nil))"
}
当我切换两个服务组的顺序时,结果如预期:第一个路由正常,而第二个不会收到body
。
这是 Compojure-api 本身的错误吗?我能做些什么来解决这个问题吗?
defapi
宏似乎将所有路由包装到 api-middleware
(查看 compojure-api source code),其中包括 wrap-params
中间件。
在您的设置中,您链接了两组路由,它们都包含在 api-middleware
中,因此在第二个 defapi
路由 (/login2) 的情况下,根据请求调用 wrap-params
中间件两次。 wrap-params
的第一次调用正确解析了参数,但第二次 wrap-params
调用没有任何要处理的内容,因此您的代码最终出现运行时错误。
要解决您的问题,请尝试通过 api-middleware
为所有 defapi
用法禁用默认换行,但只有一个。请参阅上面 link 中的 :disable-api-middleware
选项。