1

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

4

1 回答 1

1

defapi宏似乎包装了所有路由api-middleware(查看compojure-api 源代码),其中包括wrap-params中间件。在您的设置中,您链接了两组路由,它们都包装在 中,因此在第二条路由 (/login2) 的情况下两次api-middleware调用中间件。第一次调用正确解析参数,但第二次调用没有任何处理,因此您的代码最终会出现运行时错误。wrap-paramsdefapiwrap-paramswrap-params

要解决您的问题,请尝试禁用除一个api-middleware以外的所有defapi用途的默认换行。请参阅:disable-api-middleware上面链接中的选项。

于 2017-01-12T20:33:07.053 回答