(nodo: 3341) DeprecationWarning: Mongoose: mpromise


89

Sto cercando di sviluppare una classe sulla parte superiore della mangusta con i miei metodi personalizzati, quindi ho esteso la mangusta con la mia classe ma quando invoco per creare un nuovo metodo di macchina funziona ma è striscia ed errore, qui ti lascio guarda cosa sto cercando di fare.

Ricevo questo avviso

(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

dopo che lo faccio

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

driver è un'istanza della classe 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;
 }
}

qualche idea su cosa sto facendo di sbagliato?


3
Lo scrittore di Mongoose dice che: "Fallo mongoose.Promise = global.Promisee non dovresti più ricevere quell'avvertimento". github.com/Automattic/mongoose/issues/…
efkan

Risposte:


240

Ecco cosa ha funzionato per me per chiarire il problema, dopo aver letto i documenti: http://mongoosejs.com/docs/promises.html

L'esempio nel documento utilizza la libreria delle promesse bluebird ma ho scelto di seguire le promesse ES6 native.

Nel file in cui sto chiamando mongoose.connect:

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

[EDIT: Grazie a @SylonZero per aver sollevato un difetto di prestazioni nella mia risposta. Poiché questa risposta è così apprezzata, mi sento in dovere di apportare questa modifica e di incoraggiare l'uso di bluebirdpromesse locali invece di. Si prega di leggere la risposta sotto questa per dettagli più istruiti ed esperti. ]


3
Dopo aver verificato il benchmark sul sito web: bluebirdjs.com/docs/benchmarks.html @SylonZero si riferisce, credo che la sua soluzione valga la pena di votare al posto della prima proposta. Ringrazio ancora Hunter Lester per questo fantastico lavoro e indagine e per aver condiviso le sue scoperte!
Isak La Fleur

Grazie per la tua modifica che mi ha fatto capire un enorme difetto di performance
Yusuf Kamil AK

71

Sebbene la risposta sopra sia accurata e funzioni, devi tenere conto del problema delle prestazioni se hai un'app Node reale e di produzione.

La soluzione precedente utilizzerà le promesse ES6 native, che sono 4 volte più lente di bluebird nei benchmark che ho condiviso di seguito. Ciò potrebbe influire notevolmente sulle prestazioni di un'API scritta in Node e utilizzando MongoDB.

Consiglio di usare 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');

Risultati benchmark

Piattaforma: (utilizzando l'ultimo nodo al momento della scrittura)

  • Linux 4.4.0-59-generico x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • CPU Intel (R) Core (TM) i7-6500U a 2,50 GHz × 4
  • 16 GB di RAM con 500 GB SSD

    | 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
per la mia comprensione: da dove viene il tuo benchmark? Esiste un consenso su questi risultati? Sembra che tutti stiano votando per la risposta di promessa ES6 predefinita, ma vorrei approfondire i problemi di prestazioni che menzioni.
Zedenem

1
Il benchmark proviene da una suite di test che puoi leggere (e controllare) dal repository git bluebird: li ho eseguiti di nuovo localmente per ottenere i risultati sopra perché avevo bisogno dei risultati del 2017 da condividere con gli altri. Ancora più importante, ho riscontrato miglioramenti delle prestazioni nella nostra API (ho 5 micro servizi e un obiettivo di scalabilità difficile) e ho dovuto prendere spesso decisioni per utilizzare semplici callback annidati sulle promesse (ancora il più veloce). Personalmente penso che i benchmark siano solo un primo passo verso una decisione, ma non posso ancora condividere i miei dati interni ... il mio obiettivo di scala è di 10K utenti per macchina fisica.
SylonZero

Inoltre, il voto positivo non è certo una misura completa di una risposta. Nella mia esperienza, molti raramente scavano in profondità dopo che un problema è stato risolto (o letto qualcos'altro) e molti programmatori che ho seguito in passato dovevano essere istruiti sulle prestazioni e sulle abilità di strumentazione per il codice.
SylonZero

Grazie mille per aver sollevato i problemi di prestazioni. Sono un programmatore alle prime armi, solo da 2 anni, e bramo questa educazione. Lo sto usando in produzione, quindi sono ancora più felice di sapere se è così. Quali sono i modi migliori per eseguire il benchmarking di programmi e pezzi di codice?
Hunter Lester

1
Hunter, ciò dipenderebbe dalla natura della piattaforma e del codice ma legato a questa domanda: ci sono due lati per ottenere informazioni - 1. buoni test da utilizzare tramite un generatore di carico per simulare le richieste degli utenti. Uso Apache jMeter per testare la mia API Node e per generare carico per più utenti. 2. Strumentazione: come tracciare le singole transazioni. Uso NewRelic per strumentare il mio codice Node: fornisce un'analisi dettagliata di ogni transazione in ms (fino al percorso Express, tempo di query Mongo, Redis per sessioni ecc.). Spero che questo ti faccia iniziare.
SylonZero

2

hai provato questo? Per esempio :

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

se crei un modello da un'istanza di mangusta la cui promessa non è stata ridefinita, ogni query su questo modello genererebbe l'avviso.


2

Penso che tu abbia la tua risposta, ma io uso global.promise con la gestione degli errori

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

È necessario stabilire una connessione con l'aiuto di Promise nell'ultima versione di mongoose [questo è il collegamento] [1] [1]: http://mongoosejs.com/docs/promises.html



0

Mangusta 4.8.6

Se rilevi un errore come questo:

(nodo: 9600) DeprecationWarning: Mongoose: mpromise (la libreria di promesse predefinita di mongoose) è deprecata, collega invece la tua libreria di promesse: http://mongoosejs.com/docs/promises.html

È inoltre necessario impostare le opzioni che promettono la libreria da utilizzare per il 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(){
  //
})

questo lavoro per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.