(düğüm: 3341) Kullanımdan kaldırma Uyarı: Firavun faresi: mpromise


89

Özel yöntemlerimle firavun faresinin tepesinde bir sınıf geliştirmeye çalışıyorum, bu yüzden firavun faresini kendi sınıfımla genişlettim ama yeni bir araba yöntemi yaratmak için çağırdığımda işe yarıyor ama şerit ve hatası, burada size izin veriyorum ne yapmaya çalıştığımı gör.

Bu uyarıyı alıyorum

(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

yaptıktan sonra

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

sürücü, Driver sınıfının bir örneğidir

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

neyi yanlış yaptığım hakkında herhangi bir fikrin var mı?


3
Mongoose'un yazarı diyor ki: "Sadece yapın mongoose.Promise = global.Promiseve artık o uyarıyı almamalısınız." github.com/Automattic/mongoose/issues/...
efkan

Yanıtlar:


240

Belgeleri okuduktan sonra sorunu çözmem için benim için işe yarayan şey şu: http://mongoosejs.com/docs/promises.html

Belgedeki örnek, bluebird vaat kitaplığını kullanıyor, ancak ben yerel ES6 vaatleriyle gitmeyi seçtim.

Aradığım dosyada mongoose.connect:

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

[DÜZENLEME: Cevabımda bir performans kusurunu ortaya çıkardığı için @SylonZero'ya teşekkürler. Bu cevap çok iyi incelendiğinden, bu düzenlemeyi yapmak ve bluebirdyerel sözler yerine bunların kullanılmasını teşvik etmek için bir görev duygusu hissediyorum . Daha eğitimli ve deneyimli ayrıntılar için lütfen aşağıdaki cevabı okuyun. ]


3
Web sitesindeki karşılaştırmayı doğruladıktan sonra: bluebirdjs.com/docs/benchmarks.html @SylonZero'dan bahsediyor, çözümünün ilk teklif yerine oylamaya değer olduğuna inanıyorum. Hunter Lester'a bu harika çalışma ve araştırma ve bulgularını paylaştığı için hala teşekkür ediyorum!
Isak La Fleur

Büyük bir performans kusurunun farkına varmamı sağlayan düzenlemeniz için teşekkürler
Yusuf Kamil AK

72

Yukarıdaki cevap doğru ve işe yarasa da, gerçek bir üretim Node uygulamanız varsa Performans sorununu hesaba katmalısınız.

Yukarıdaki çözüm , aşağıda paylaştığım kıyaslamalarda bluebird'den 4 kat daha yavaş olan yerel ES6 vaatlerini kullanacak . Bu, Düğümde yazılan ve MongoDB kullanan bir API'nin performansını önemli ölçüde etkileyebilir.

Bluebird kullanmanızı tavsiye ederim:

// 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');

Karşılaştırma Sonuçları

Platform: (yazarken en son Düğümü kullanarak)

  • Linux 4.4.0-59-genel x64
  • Düğüm.JS 6.9.4
  • V8 5.1.281.89
  • Intel (R) Core (TM) i7-6500U CPU @ 2.50GHz × 4
  • 500 GB SSD ile 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
anladığım kadarıyla: kıyaslamanız nereden geliyor? Bu sonuçlar etrafında bir fikir birliği var mı? Görünüşe göre herkes varsayılan ES6 vaat cevabına oy veriyor, ancak bahsettiğiniz performans konularında daha derine inmek istiyorum.
Zedenem

1
Karşılaştırma, bluebird git repo'sundan okuyabileceğiniz (ve inceleyebileceğiniz) bir dizi testten geliyor - yukarıdaki sonuçları almak için bunları yerel olarak tekrar çalıştırdım çünkü başkalarıyla paylaşmak için 2017 sonuçlarına ihtiyacım vardı. Daha da önemlisi, kendi API'mizde performans kazanımları yaşadım (5 mikro hizmetim var ve zorlu bir ölçeklenebilirlik hedefim var) ve sözler yerine basit iç içe geçmiş geri aramaları kullanma kararları vermek zorunda kaldım (hala en hızlısı). Şahsen ben ölçütlerin bir karara doğru sadece ilk adım olduğunu düşünüyorum, ancak henüz dahili verilerimi paylaşamıyorum ... Ölçek hedefim fiziksel makine başına 10K Kullanıcı
SylonZero

Ayrıca, olumlu oylama, bir yanıt hakkında neredeyse tam bir ölçü değildir. Deneyimlerime göre, çoğu bir problem çözüldükten sonra (veya başka bir şey okuduktan) sonra nadiren derinlere iniyor ve geçmişte akıl hocalığı yaptığım birçok programcının kod için performans ve enstrümantasyon becerileri hakkında öğretilmesi gerekiyordu.
SylonZero

1
Performans sorunlarını gündeme getirdiğiniz için çok teşekkür ederim. Acemi bir programcıyım, sadece 2 yıldır ve bu eğitimi arzuluyorum. Bunu üretimde kullanıyorum, bu yüzden bunu bildiğime çok daha çok sevindim. Kıyaslama programları ve kod parçaları hakkında gitmenin en iyi yolları nelerdir?
Hunter Lester

1
Hunter, bu, platformun yapısına ve koda bağlı olabilir, ancak bu soruyla ilgili: içgörü elde etmenin iki yönü vardır - 1. Kullanıcı isteklerini simüle etmek için bir yük oluşturucu aracılığıyla kullanılacak iyi testler. Node API'mi test etmek ve birden çok kullanıcı için yük oluşturmak için Apache jMeter kullanıyorum. 2. Enstrümantasyon: bireysel işlemleri nasıl takip edersiniz. Node kodumu kullanmak için NewRelic kullanıyorum - her işlemin ms cinsinden ayrıntılı bir dökümünü verir (Ekspres yol, Mongo sorgu süresi, oturumlar için Redis vb.). Umarım bu seni başlatır.
SylonZero

2

bunu denedin mi Örneğin :

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

Firavun faresi örneğinden bir model oluşturursanız, vaat edilenler yeniden tanımlanmamıştır - bu modeldeki her sorgu uyarıyı verir.


2

Cevabınızı aldığınızı düşünüyorum ama hata işleme ile global.promise kullanıyorum

// 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;
      }
});

Firavun faresinin en son sürümündeki sözün yardımıyla bağlantı kurulması gerekir [bu bağlantı] [1] [1]: http://mongoosejs.com/docs/promises.html



0

Firavun Faresi 4.8.6

Böyle bir hata yakalarsanız:

(düğüm: 9600) Kullanımdan Kaldırma Uyarı: Mongoose: mpromise (firavun faresi'nin varsayılan söz kitaplığı) kullanımdan kaldırıldı, bunun yerine kendi söz kitaplığınızı ekleyin: http://mongoosejs.com/docs/promises.html

Kitaplığın sürücü için kullanılmasını vaat eden seçenekleri de ayarlamanız gerekir.

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(){
  //
})

bu benim için çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.