2017-05-24 6 views
0

現在、MongooseとBluebirdをプラグインPromiseライブラリとして使用しています。 後マングースのドキュメントは、私は次のように行われている:あなたが見ることができるようにBluebirdのPromise.map()がmongooseに接続されているときにMongooseと連携していません。Promise

var mongoose = require('mongoose'); 
mongoose.Promise = require('bluebird'); 

// Some function making use of Bluebird's Promise.map() 
function someFn() { 
    return Promise.map([ 
     someModel.findById(someId).exec(), 
     someOtherModel.findById(someOtherId).exec() 
    ], mapperFn) 
     .then(function() {}) 
     .catch(function() {}); 
} 

が、私は自分のコードに青い鳥のPromise.map()を使用しようとしていますが、私は次のエラー得続ける:次に

TypeError: Promise.map is not a function 

を私は、これは働いていたこの

var mongoose = require('mongoose'); 
var Promise = require('bluebird'); 

// Some function making use of Bluebird's Promise.map() 
function someFn() { 
    return Promise.map([ 
     someMode.findById(someId).exec(), 
     someOtherModel.findById(someOtherId).exec() 
    ], mapperFn) 
     .then(function() {}) 
     .catch(function() {}); 
} 

のように、青い鳥を必要と新しいvar Promiseにそれを設定することで試みたが、右ではないようですこの問題にアプローチする方法。これがmongooseコード内の他の変数との矛盾を引き起こすかどうかはわかりません。

この作品を作るための提案はありますか?

答えて

1

Promise.map()を使用するには、通常のES6 Promiseだけでなく、PromiseをBluebirdのオブジェクトに定義する必要があります。あなたも、ちょうどこの操作を行うことができ、

let Promise = require('bluebird'); 
mongoose.Promise = Promise; 

をか:あなたはこのようにそれを行うだろう

let Promise = mongoose.Promise = require('bluebird'); 

それがあったとして、あなたはPromiseの定期的なES6バージョンでPromise.map()をやろうとしました。


あなたの第二のアプローチは適切にブルーバードのライブラリであることをPromiseを定義したとPromise.map()が働いていた理由ですが、あなたは限りあるため約束の異なるタイプ間の約束の相互運用性のいくつかのケースで動作しますマングースとブルーバードの約束を使用していませんでしたあなたはマングースから戻ってきた約束の上にのみ.then()を使用しているので、無数のBluebirdの追加の方法のような特別なものはありません。

0

Promiseではなくmongoose.Promiseを定義し、その範囲に存在しない変数であるPromiseを使用してエラーが発生しました。

第2のアプローチは、mongoose内の何も変更していないようです。しかし、ちょうどそれがどのようにpromiseArrayが定義されているか見て興味深いだろうことを確認する。

thencatchのハンドラとしてundefinedを渡すことはお勧めしません。

+0

編集して、自分が行っていることのより正確な図を表示してください。 –

+0

あなたが提案した 'mongoose.Promise'を' Promise'に変更することによって、私はそれを動作させました。さて、私の質問は、これはモンゴースの約束の残りの部分にブルーバードを適用するのだろうか?これは、mongooseのデフォルトのmpromiseを上書きするでしょうか? –

+0

mongooseのドキュメントによると、mongooseはPromises/A +準拠の約束を使用しています。彼らはブルーバードと相互運用可能でなければならず、プロミスズ/ A +標準も実装しなければならないという意味です。 2つ目の方法に従えば、あなたはどのような方法でもマングースを変更していません。 bluebirdを使いたい場合は、まだ 'mongoose.Promise = require( 'bluebird')'のステップを実行することを強くお勧めします。 – arboreal84

関連する問題