2016-10-26 7 views
1

現在、Luminusテンプレートに+ swaggerオプションを使用しています。これにはcompojure-apiサポートが追加されています。これ(のみ関連ビット)のようなCompojure-apiは、APIルートの最初のグループの後でbody-paramを削除します

私の現在の設定がされています

(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"のルートは であった。私は2つのサービスグル​​ープの順序を切り替えると期待どおりしかし、全く同様"/login2"戻り

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

、結果は:第二にbodyを受信しないであろうしつつ、第1の経路は、正常に動作します。

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

答えて

0

defapiマクロは、wrap-paramsミドルウェアを含むapi-middleware(チェックアウトcompojure-api source code)へのすべてのルートをラップするようです。 設定では、api-middlewareにラップされた2つのルートセットを連鎖しており、2番目のdefapiルート(/ login2)が2回ある場合は、リクエストでwrap-paramsミドルウェアを呼び出します。 wrap-paramsの最初の呼び出しではパラメータが正しく解決されますが、2番目のwrap-params呼び出しには何も処理がないため、コードが実行時エラーとなります。

問題を解決するには、defapiのすべての用途(ただし、1つを除く)についてはデフォルトのラッピングをapi-middlewareで無効にしてください。上記のリンクの:disable-api-middlewareオプションをご覧ください。

関連する問題