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