Compojure-api удаляет body-param после первой группы маршрутов API

В настоящее время я использую шаблон Luminus с опцией +swagger, которая добавляет поддержку 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 для тестирования этих маршрутов, и "/login" Трасса работала нормально. Тем не менее, полностью аналогичные "/login2" возвращается

{
  "errors": "(not (map? nil))"
}

Когда я переключаю порядок двух сервисных групп, результат будет таким, как ожидалось: первый маршрут работает нормально, а второй не получит body,

Это ошибка с самим Compojure-api? И что я могу сделать, чтобы обойти это?

1 ответ

Решение

defapi Макрос, кажется, обернуть все маршруты api-middleware (посмотрите исходный код compojure-api), который включает wrap-params промежуточное программное обеспечение. В вашей настройке вы объединяете два набора маршрутов, оба обернутые в api-middleware и, таким образом, называя wrap-params промежуточное ПО по запросу в случае второго defapi маршрут (/login2) дважды. Первый звонок wrap-params разрешает параметры правильно, но второй wrap-params вызов не имеет ничего для обработки, и поэтому ваш код заканчивается ошибкой во время выполнения.

Чтобы решить вашу проблему, попробуйте отключить упаковку по умолчанию api-middleware для всех ваших defapi использования, но один. Увидеть :disable-api-middleware вариант по ссылке выше.

Другие вопросы по тегам