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