web-dev-qa-db-ja.com

(ノード:3341)非推奨警告:マングース:mpromise

私は自分のカスタムメソッドでマングースの上にクラスを開発しようとしているので、私は自分自身のクラスでマングースを拡張しました。私がやろうとしていることを参照してください。

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

(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;
 }
}

imが悪いことをしていることについて何か考えがありますか?

87

ドキュメントを読んだ後、私が問題を解決するのに役立ったのは次のとおりです。 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の使用を奨励する義務があると感じます。もっと知識が豊富で経験豊富な詳細については、この下の答えを読んでください。 ]

233
Hunter Lester

上記の答えは正確で正しく機能しますが、実際の本番用Nodeアプリがある場合は、Performanceの問題を考慮する必要があります。

上記の解決策はネイティブES6の約束を使用するでしょう - これは私が以下で共有しているベンチマークの中のbluebirdより4X遅いです。これは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-ジェネリックx64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • インテル(R)コア(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     |
69
SylonZero

これを試しましたか?例えば ​​:

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
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

1

マングース4.8.6

このようなエラーを見つけた場合:

(node: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
dimpiax

Connect()メソッドにオブジェクトとして2番目のパラメータを追加するだけです。

mongoose.connect('dbUrl', {
  useMongoClient: true
});

参照してください: http://mongoosejs.com/docs/connections.html#use-mongo-client

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

これは私のために働きます。

0
sgtkuncoro

私はあなたがあなたの答えを持っていると思うが、私はエラー処理で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);
});
0
Saurabh Lende