Compojure-api在第一组API路由之后删除了body-param

时间:2016-10-26 09:18:14

标签: clojure compojure luminus compojure-api

我目前正在使用带有+ 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本身的错误吗?我能做些什么来解决这个问题吗?

1 个答案:

答案 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选项。