(node: 3341) DeprecationWarning: Mongoose: mpromise


89

Saya mencoba mengembangkan kelas di atas luwak dengan metode khusus saya, jadi saya memperluas luwak dengan kelas saya sendiri tetapi ketika saya meminta untuk membuat metode mobil baru itu berfungsi tetapi strip dan kesalahannya, di sini saya biarkan Anda lihat apa yang saya coba lakukan.

Saya mendapatkan peringatan ini

(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

setelah saya lakukan

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

driver adalah turunan dari kelas 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;
 }
}

ada pemikiran tentang apa yang saya lakukan salah?


3
Penulis Mongoose mengatakan bahwa: "Lakukan saja mongoose.Promise = global.Promisedan Anda tidak akan mendapatkan peringatan itu lagi." github.com/Automattic/mongoose/issues/…
efkan

Jawaban:


240

Inilah yang berhasil bagi saya untuk menyelesaikan masalah, setelah membaca dokumen: http://mongoosejs.com/docs/promises.html

Contoh di dokumen menggunakan pustaka janji bluebird tetapi saya memilih untuk menggunakan janji ES6 asli.

Di file tempat saya menelepon mongoose.connect:

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

[EDIT: Terima kasih kepada @SylonZero karena mengemukakan cacat kinerja dalam jawaban saya. Karena jawaban ini sangat dilihat, saya merasa berkewajiban untuk melakukan pengeditan ini dan mendorong penggunaan bluebirdalih-alih janji asli. Silakan baca jawaban di bawah ini untuk detail yang lebih berpendidikan dan berpengalaman. ]


3
Setelah memverifikasi tolok ukur di situs web: bluebirdjs.com/docs/benchmarks.html yang dimaksud @SylonZero, saya yakin solusinya adalah layak untuk dipilih alih-alih proposal pertama. Saya masih berterima kasih kepada Hunter Lester atas pekerjaan dan penyelidikan yang luar biasa ini serta membagikan temuannya!
Isak La Fleur

Terima kasih atas suntingan Anda yang membuat saya menyadari kekurangan kinerja yang besar
Yusuf Kamil AK

72

Meskipun jawaban di atas akurat dan berfungsi, Anda harus memperhitungkan masalah Kinerja jika Anda memiliki aplikasi Node produksi yang nyata.

Solusi di atas akan menggunakan promise ES6 asli - yang 4X lebih lambat dari bluebird dalam tolok ukur yang saya bagikan di bawah. Ini secara dramatis dapat memengaruhi kinerja API yang ditulis dalam Node dan menggunakan MongoDB.

Saya merekomendasikan menggunakan 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');

Hasil Tolok Ukur

Platform: (menggunakan Node terbaru pada saat penulisan)

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

    | 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
untuk pemahaman saya: dari mana benchmark Anda berasal? Apakah ada konsensus seputar hasil ini? Sepertinya semua orang memilih jawaban janji ES6 default, tetapi saya ingin menggali lebih dalam masalah kinerja yang Anda sebutkan.
Zedenem

1
Tolok ukurnya berasal dari serangkaian tes yang dapat Anda baca (dan dokter hewan) dari bluebird git repo - Saya menjalankannya lagi secara lokal untuk mendapatkan hasil di atas karena saya membutuhkan hasil 2017 untuk dibagikan dengan orang lain. Lebih penting lagi, saya telah mengalami peningkatan kinerja di API kami sendiri (saya memiliki 5 layanan mikro dan target skalabilitas yang tangguh) dan harus sering membuat keputusan untuk menggunakan panggilan balik bersarang sederhana atas janji (masih yang tercepat). Saya pribadi berpikir tolok ukur hanyalah langkah pertama menuju keputusan tetapi saya belum dapat membagikan data internal saya ... target skala saya adalah 10K Pengguna per mesin fisik.
SylonZero

Juga, upvoting bukanlah ukuran penuh tentang sebuah jawaban. Dalam pengalaman saya, banyak yang jarang menggali lebih dalam setelah masalah dipecahkan (atau membaca yang lain) dan banyak programmer yang pernah saya bimbing di masa lalu perlu diajarkan tentang kinerja dan keterampilan instrumentasi untuk kode.
SylonZero

1
Terima kasih banyak telah mengemukakan masalah kinerja. Saya seorang programmer pemula, hanya 2 tahun melakukannya, dan mendambakan pendidikan ini. Saya menggunakan ini dalam produksi, jadi saya bahkan lebih senang mengetahuinya. Apa cara terbaik untuk melakukan benchmarking program dan potongan kode?
Hunter Lester

1
Hunter, itu akan tergantung pada sifat platform dan kodenya tetapi terkait dengan pertanyaan ini: ada dua sisi untuk mendapatkan wawasan - 1. pengujian yang baik untuk digunakan melalui generator beban untuk mensimulasikan permintaan pengguna. Saya menggunakan Apache jMeter untuk menguji Node API saya dan menghasilkan beban untuk banyak pengguna. 2. Instrumentasi: bagaimana Anda melacak transaksi individu. Saya menggunakan NewRelic untuk melengkapi kode Node saya - ini memberikan perincian terperinci dari setiap transaksi dalam ms (hingga ke rute Express, waktu kueri Mongo, Redis untuk sesi, dll.). Semoga ini membantu Anda memulai.
SylonZero

2

apakah kamu mencoba ini? Sebagai contoh :

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

jika Anda membuat model dari instance luwak yang janji tidak didefinisikan ulang - setiap kueri pada model ini akan memberikan peringatan.


2

Saya pikir Anda punya jawaban tetapi saya menggunakan global.promise dengan penanganan kesalahan

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

Seseorang harus memiliki koneksi dengan bantuan janji di versi terbaru luwak [ini adalah tautannya] [1] [1]: http://mongoosejs.com/docs/promises.html



0

Luwak 4.8.6

Jika Anda menemukan kesalahan seperti ini:

(node: 9600) DeprecationWarning: Mongoose: mpromise (library promise default mongoose) tidak digunakan lagi, colokkan library promise Anda sendiri sebagai gantinya: http://mongoosejs.com/docs/promises.html

Anda juga perlu menyetel opsi yang menjanjikan library yang akan digunakan untuk driver.

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

ini bekerja untuk saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.