web-dev-qa-db-ja.com

Mongooseの約束にBluebirdを使用する正しい方法は何ですか?

私はドキュメンタリーと記事を読んでいて、みんながマングースとブルーバードを一緒に使うことについて別の方法を述べているようです。公式のマングースのドキュメント 何かを言う でさえ、ブルーバードのドキュメントは 別のこと と言っています。

マングースによると:

_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で始めることもできます。

本当に別のドキュメンタリーと混同されています。誰かがこれに光を当てることができれば幸いです。

11
Özgür Uysal

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().constructorrequire('bluebird')に置き換えられたので、代わりに.exec()でreturn promiseを取得すると、次のようなマングースクエリに直接bluebird確率を使用できます

_User.findOne({}).then(function(user){
    // ..
})  
_
9
stasovlas

マングースの方法を選択してください:

_mongoose.Promise = require('bluebird');
_

これは、Mongoose alreadyがPromiseをサポートしているためです(コールバックも受け入れる)。上記のコードは、Mongoose独自のpromiseライブラリ( mpromise )をBluebirdで置き換えただけです(おそらくより高速で、より適切にテストされており、より多くのユーティリティ関数を使用できます)。

Bluebirdのpromisify*()は、alreadyプロミス(純粋にコールバックベースの関数)を使用してプロミスを返さないコードを許可することを目的としています。

24
robertklep

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;
1
Janac Meena