私はドキュメンタリーと記事を読んでいて、みんながマングースとブルーバードを一緒に使うことについて別の方法を述べているようです。公式のマングースのドキュメント 何かを言う でさえ、ブルーバードのドキュメントは 別のこと と言っています。
マングースによると:
_mongoose.Promise = require('bluebird');
_
ブルーバードによると:
_var Promise = require("bluebird");
Promise.promisifyAll(require("mongoose"));
_
したがって、私の理解では、Mongooseの方法を選択すると、サンプルクエリは次のようになります。
_User.findById('someId')
.then(function(){
// do stuff
})
.catch(function(err){
// handle error
})
_
しかし、Mongooseのドキュメントでも次のように書かれています:
マングースクエリは約束ではありません。ただし、yieldおよびasync/awaitの.then()関数はあります。完全なプロミスが必要な場合は、.exec()関数を使用してください。
したがって、この場合、_.then
_は約束を上回っていますか?
ブルーバードの方法で行く場合:
_User.findById('someId')
.execAsync()
.then(function(){
// do stuff
})
.catch(function(err){
// handle error
})
_
または、execAsync()
をスキップして、代わりにfindByIdAsync
で始めることもできます。
本当に別のドキュメンタリーと混同されています。誰かがこれに光を当てることができれば幸いです。
Bluebird docから
_Promise.promisifyAll(
Object target,
[Object {
suffix: String="Async",
multiArgs: boolean=false,
filter: boolean function(String name, function func, Object target, boolean passesDefaultFilter),
promisifier: function(function originalFunction, function defaultPromisifier)
} options] ) -> Object
_
ご覧のように、デフォルトでは、promisifyAllにサフィックス「Asyns」を追加します。このため、この方法で約束を付ける場合は、次のようになります。
_var Promise = require("bluebird");
Promise.promisifyAll(require("mongoose"));
_
_User.findById
_の非同期バージョンは_User.findByIdAsync
_になります
mongoose.Promiseについて
それからあなたは約束ライブラリを使用します
_mongoose.Promise = require('bluebird');
_
組み込みのpromiseメカニズムがライブラリに置き換えられました:query.exec().constructor
がrequire('bluebird')
に置き換えられたので、代わりに.exec()
でreturn promiseを取得すると、次のようなマングースクエリに直接bluebird確率を使用できます
_User.findOne({}).then(function(user){
// ..
})
_
マングースの方法を選択してください:
_mongoose.Promise = require('bluebird');
_
これは、Mongoose alreadyがPromiseをサポートしているためです(コールバックも受け入れる)。上記のコードは、Mongoose独自のpromiseライブラリ( mpromise
)をBluebirdで置き換えただけです(おそらくより高速で、より適切にテストされており、より多くのユーティリティ関数を使用できます)。
Bluebirdのpromisify*()
は、alreadyプロミス(純粋にコールバックベースの関数)を使用してプロミスを返さないコードを許可することを目的としています。
TypeScriptを使用している場合、正しい方法は次のとおりです。
(<any>mongoose).Promise = YOUR_PROMISE;
ドキュメントから:
TypeScript does not allow assigning properties of imported modules. To avoid compile errors use one of the options below in your code:
(<any>mongoose).Promise = YOUR_PROMISE;
require('mongoose').Promise = YOUR_PROMISE;
import mongoose = require('mongoose'); mongoose.Promise = YOUR_PROMISE;