2017-01-22 2 views
0

Swaggerを使用して、RESTエンドポイントのセットを呼び出すJS APIクライアントを作成しています。 Promises(new Swagger({ spec: spec, usePromise: true }))を使用するようにSwaggerクライアントを構成しています。Swaggerを使用したBluebird Promise:戻り値は関数ではありません

I require Bluebird before Swagger、Bluebirdの約束を使用する。しかし、Promise.returnを使用しようとすると、私のアプリが爆発しています。

コードは

クライアントが闊歩参照です
client.user.get_db_user(db).return("foo"); 

のように見えます。

私が手にエラーは、私がthen(() => value)returnを交換する場合、それは動作します

app: TypeError: client.user.get_db_user(...).return is not a function 

です。 returnは、thenのこの種の使用の省略形であると考えられています。

調査したところ、Swaggerクライアントから返された約束が破綻していることがわかりました。

何が起こっているか

答えて

1

Swaggerは明示的にQ promiseライブラリを使用しています。

BluebirdとQは部分的に互換性がありますので、多くのことが問題なく動作します。この問題は、Qが持っていないBluebird APIの部分を使用しようとしたときに発生します。

特に、ブルーバードは「リターン」を持っていますが、Qはそうではありません。

最も簡単な答えは、質問で説明したthen構成を使用することです。

私が試してみ至っていない他の可能な解決策:

  1. は、ブルーバードとQを交換する「ブルーバード-Q」プロジェクトを使用してください。
  2. PromisifyAll Swaggerは、Swaggerの組み込みの約束をサポートする代わりに使用します。
2

SwaggerにBluebirdの約束を使用するよう指示することはできません。しかし、Bluebirdのメソッドを使用する特定の場所では、Swaggerの約束をBluebirdの約束に「キャスト」し、Bluebirdの機能を使用することができます。そのような約束を変換するには、あなただけPromise.resolve()でラップ:

const Promise = require('bluebird'); 

Promise.resolve(client.user.get_db_user(db)).return(...) 

.return()はあなたにいくつかの入力を保存することだけがあるので、あなたがした後、この特定のケースでは、それは本当にネット貯蓄ではありませんが、前の約束をPromise.resolve()にラップしました。しかし、より意味のある方法、例えば.map()やそのようなものについては、もっと役に立つかもしれません。

関連する問題