(ノード:3341)DeprecationWarning:Mongoose:mpromise


89

私はカスタムメソッドを使用してマングースの上にクラスを開発しようとしているので、独自のクラスでマングースを拡張しましたが、新しい車のメソッドを作成するために呼び出すと、機能しますが、ストリップとエラーが発生します。ここで、私がやろうとしていることを見てください。

私はこの警告を受けています

(node:3341) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

私がした後

driver.createCar({
      carName: 'jeep',
      availableSeats: 4,
    }, callback);

driverはDriverクラスのインスタンスです

const carSchema = new Schema({
  carName: String,
  availableSeats: Number,
  createdOn: { type: Date, default: Date.now },
});
const driverSchema = new Schema({
 email: String,
 name: String,
 city: String,
 phoneNumber: String,
 cars: [carSchema],
 userId: {
   type: Schema.Types.ObjectId,
   required: true,
 },
createdOn: { type: Date, default: Date.now },
});
const DriverModel = mongoose.model('Driver', driverSchema);

class Driver extends DriverModel {
  getCurrentDate() {
  return moment().format();
}
create(cb) {
  // save driver
  this.createdOn = this.getCurrentDate();
  this.save(cb);
}
remove(cb) {
  super.remove({
  _id: this._id,
 }, cb);
}
createCar(carData, cb) {
  this.cars.push(carData);
  this.save(cb);
}
getCars() {
  return this.cars;
 }
}

イムが間違っていることについて何か考えはありますか?


3
マングースの作者はこう言っています:「やればいいしmongoose.Promise = global.Promise、もうその警告を受けるべきではない」。 github.com/Automattic/mongoose/issues/…– efkan 2017
1

回答:


240

ドキュメントを読んだ後、問題を解決するために私が働いたことは次のとおりです:http : //mongoosejs.com/docs/promises.html

ドキュメントの例ではbluebird promiseライブラリを使用していますが、ネイティブES6 promiseを使用することを選択しました。

私が呼んでいるファイルでmongoose.connect

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://10.7.0.3:27107/data/db');

[編集:私の回答にパフォーマンスの欠陥をもたらした@SylonZeroに感謝します。この回答は非常によく見られるため、この編集を行いbluebird、ネイティブプロミスの代わりに使用することを奨励する義務感を感じます。教育を受けた経験豊富な詳細については、この下の回答をお読みください。]


3
ウェブサイトでベンチマークを確認した後:bluebirdjs.com/docs/benchmarks.html @SylonZeroが参照しているので、私は彼の解決策が最初の提案の代わりに賛成票を投じる価値があると信じています。この素晴らしい仕事と調査、そして彼の発見を共有してくれたハンターレスターに今でも感謝します!
Isak La Fleur

大きなパフォーマンスの欠陥を認識させてくれる編集に感謝します
Yusuf Kamil AK

71

上記の答えは正確で機能しますが、実際の本番ノードアプリがある場合は、パフォーマンスの問題を考慮する必要があります。

上記のソリューションでは、ネイティブES6のプロミスを使用します。これは、以下で共有したベンチマークで、bluebird より4倍遅いです。これは、Nodeで記述され、MongoDBを使用するAPIのパフォーマンスに劇的な影響を与える可能性があります。

Bluebirdの使用をお勧めします:

// Assuming you store the library in a var called mongoose
var mongoose = require('mongoose');

// Just add bluebird to your package.json, and then the following line should work
mongoose.Promise = require('bluebird');

ベンチマーク結果

プラットフォーム:(執筆時点で最新のノードを使用)

  • Linux 4.4.0-59-generic x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • Intel(R)Core(TM)i7-6500U CPU @ 2.50GHz×4
  • 500 GB SSDを搭載した16 GB RAM

    | file                                      | time(ms) | memory(MB) |
    |-------------------------------------------|----------|------------|
    | callbacks-baseline.js                     | 114      | 25.09      |
    | callbacks-suguru03-neo-async-waterfall.js | 152      | 32.98      |
    | promises-bluebird-generator.js            | 208      | 29.89      |
    | promises-bluebird.js                      | 223      | 45.47      |
    | promises-cujojs-when.js                   | 320      | 58.11      |
    | promises-then-promise.js                  | 327      | 64.51      |
    | promises-tildeio-rsvp.js                  | 387      | 85.17      |
    | promises-lvivski-davy.js                  | 396      | 81.18      |
    | callbacks-caolan-async-waterfall.js       | 527      | 97.45      |
    | promises-dfilatov-vow.js                  | 593      | 148.30     |
    | promises-calvinmetcalf-lie.js             | 666      | 122.78     |
    | generators-tj-co.js                       | 885      | 121.71     |
    | promises-obvious-kew.js                   | 920      | 216.08     |
    | promises-ecmascript6-native.js            | 931      | 184.90     |
    | promises-medikoo-deferred.js              | 1412     | 158.38     |
    | streamline-generators.js                  | 1695     | 175.84     |
    | observables-Reactive-Extensions-RxJS.js   | 1739     | 218.96     |
    | streamline-callbacks.js                   | 2668     | 248.61     |
    | promises-kriskowal-q.js                   | 9889     | 410.96     |
    | observables-baconjs-bacon.js.js           | 21636    | 799.09     |
    | observables-pozadi-kefir.js               | 51601    | 151.29     |
    | observables-caolan-highland.js            | 134113   | 387.07     |

1
私の理解のために:あなたのベンチマークはどこから来ていますか?これらの結果についてコンセンサスはありますか?誰もがデフォルトのES6の約束の答えに投票しているようですが、私はあなたが言及するパフォーマンスの問題をさらに掘り下げたいと思います。
ゼデネム2017

1
ベンチマークは、bluebird gitリポジトリから読み取り(および獣医)できる一連のテストからのものです。2017年の結果を他のユーザーと共有する必要があるため、上記の結果を得るためにローカルで再度実行しました。さらに重要なことに、私は独自のAPIでパフォーマンスの向上を経験し(5つのマイクロサービスと厳しいスケーラビリティターゲットを持っています)、Promiseよりも単純なネストされたコールバックを使用することを決定する必要がありました(それでも最速です)。個人的には、ベンチマークは決定への第一歩に過ぎないと思いますが、まだ内部データを共有することはできません...私のスケールターゲットは、物理マシンあたり10Kユーザーです。
SylonZero 2017

また、賛成票は答えについての完全な尺度ではありません。私の経験では、問題が解決された(または他のことを読んだ)後、多くの人がめったに掘り下げることはなく、過去に指導したプログラマーの多くは、コードのパフォーマンスとインスツルメンテーションスキルについて教える必要がありました。
SylonZero 2017

パフォーマンスの問題を取り上げていただき、ありがとうございます。私は初心者プログラマーで、わずか2年間で、この教育を切望しています。私はこれを本番環境で使用しているので、それを知ってとても嬉しく思います。プログラムやコードをベンチマークするための最良の方法は何ですか?
ハンターレスター2017

1
ハンター、それはプラットフォームとコードの性質に依存しますが、この質問に関連しています。洞察を得るためには2つの側面があります。Apache jMeterを使用してNode APIをテストし、複数のユーザーの負荷を生成します。2.計装:個々のトランザクションをどのように追跡しますか。NewRelicを使用してNodeコードをインストルメント化します。これにより、すべてのトランザクションの詳細な内訳がミリ秒で表示されます(エクスプレスルート、Mongoクエリ時間、セッションのRedisなど)。これであなたが始められることを願っています。
SylonZero 2017

2

これやってみましたか?例えば ​​:

const mongoose = require('mongoose')
mongoose.Promise = global.Promise // <--
const Schema = mongoose.Schema
const UserSchema = new Schema({
  name: String,
})
const User = mongoose.model('user', UserSchema)
module.exports = User

約束が再定義されていないマングースインスタンスからモデルを作成した場合、このモデルに対するすべてのクエリは警告をスローします。


2

私はあなたがあなたの答えを持っていると思いますが、エラー処理でglobal.promiseを使用しています

// MongoDB connection
mongoose.Promise = global.Promise;

var promise = mongoose.connect('mongodb://localhost:27017/test_db', {
  useMongoClient: true,
});

promise.then(function(db) {
    console.log("Connected to database!!!");
}, function(err){
    console.log("Error in connecting database " + err);
});

1
var mydb;
var uri = 'mongodb://localhost/user1';
var promise = mongooose.connect(uri,{
      useMongoClient: true,
});
promise.openUri(uri,function(errr,db){
if(errr){
        throw errr;
      }else{
        console.log("Connection Successfull");      
        mydb = db;
      }
});

最新バージョンのmongooseのpromiseのヘルプとの接続が必要です[これはリンクです] [1] [1]:http : //mongoosejs.com/docs/promises.html



0

マングース4.8.6

このようなエラーをキャッチした場合:

(ノード:9600)DeprecationWarning:Mongoose:mpromise(mongooseのデフォルトのpromiseライブラリ)は非推奨です代わりに独自のpromiseライブラリをプラグインしてください:http ://mongoosejs.com/docs/promises.html

また、ドライバーに使用するライブラリを約束するオプションを設定する必要があります。

mongoose.Promise = global.Promise
mongoose.connect(uri, { useMongoClient: true, options: { promiseLibrary: mongoose.Promise }})

0
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
db = mongoose.connect(env.DATABASE_URI, function(){
  //
})

この仕事は私にとって。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.