1

私は現在、compojure-api サポートを追加する +swagger オプションを指定してLuminusテンプレートを使用しています。

私の現在のセットアップはそうです(関連するビットのみ):

(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))"
}

2 つのサービス グループの順序を入れ替えると、結果は期待どおりです。最初のルートは正常に機能しますが、2 番目のルートはbody.

これは Compojure-api 自体のバグですか? そして、これを回避するために私にできることはありますか?

4

1 に答える 1

1

defapiマクロは、ミドルウェアを含む( compojure-api ソース コードをapi-middlewareチェックしてください) へのすべてのルートをラップしているようです。セットアップでは、2 つのルートのセットを連鎖させているため、2 番目のルート (/login2) が 2 回発生した場合に、リクエストでミドルウェアを呼び出します。の最初の呼び出しはパラメーターを正しく解決しますが、2 番目の呼び出しでは処理するものが何もないため、コードはランタイム エラーで終了します。wrap-paramsapi-middlewarewrap-paramsdefapiwrap-paramswrap-params

api-middleware問題を解決するには、1 つを除くすべての使用法について、デフォルトのラッピングを無効にしてみてくださいdefapi:disable-api-middleware上のリンクのオプションを参照してください。

于 2017-01-12T20:33:07.053 に答える