(nœud: 3341) DeprecationWarning: Mongoose: mpromise

89

J'essaye de développer une classe sur le dessus de la mangouste avec mes méthodes personnalisées, donc j'ai étendu la mangouste avec ma propre classe mais quand j'invoque pour créer une nouvelle méthode de voiture cela fonctionne mais sa bande et son erreur, ici je vous laisse voyez ce que j'essaye de faire.

Je reçois cet avertissement

(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

après je fais

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

driver est une instance de la 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;
 }
}

des pensées sur ce que je fais mal?

Audel O. Gutierrez
la source
3
L'écrivain de Mongoose dit: " mongoose.Promise = global.PromiseFaites simplement et vous ne devriez plus recevoir cet avertissement." github.com/Automattic/mongoose/issues/…
efkan

Réponses:

240

Voici ce qui a fonctionné pour moi pour résoudre le problème, après avoir lu la documentation: http://mongoosejs.com/docs/promises.html

L'exemple dans la documentation utilise la bibliothèque de promesses bluebird mais j'ai choisi d'aller avec les promesses natives ES6.

Dans le fichier où j'appelle mongoose.connect:

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

[EDIT: Merci à @SylonZero pour avoir soulevé une faille de performance dans ma réponse. Étant donné que cette réponse est si appréciée, je ressens le devoir de faire cette modification et d'encourager l'utilisation de bluebirdpromesses natives plutôt que natives. Veuillez lire la réponse ci-dessous celle-ci pour des détails plus instruits et expérimentés. ]

Chasseur Lester
la source
3
Après avoir vérifié la référence sur le site: bluebirdjs.com/docs/benchmarks.html @SylonZero fait référence, je ne crois sa solution en vaut la peine jusqu'à voter à sa place de la première proposition. Je remercie toujours Hunter Lester pour ce grand travail et cette enquête et pour partager ses découvertes!
Isak La Fleur
Merci pour votre montage qui me fait réaliser un énorme défaut de performance
Yusuf Kamil AK
71

Bien que la réponse ci-dessus soit précise et fonctionne, vous devez tenir compte du problème des performances si vous avez une véritable application Node de production.

La solution ci-dessus utilisera les promesses ES6 natives - qui sont 4X plus lentes que bluebird dans les benchmarks que j'ai partagés ci-dessous. Cela pourrait affecter considérablement les performances d'une API écrite dans Node et utilisant MongoDB.

Je recommande d'utiliser 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');

Résultats de référence

Plate-forme: (en utilisant le dernier nœud au moment de la rédaction)

  • Linux 4.4.0-59-x64 générique
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • Processeur Intel (R) Core (TM) i7-6500U à 2,50 GHz × 4
  • 16 Go de RAM avec 500 Go de 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     |
SylonZero
la source
1
pour ma compréhension: d'où vient votre benchmark? Y a-t-il un consensus autour de ces résultats? Il semble que tout le monde vote pour la réponse par défaut de la promesse ES6, mais j'aimerais approfondir les problèmes de performances que vous mentionnez.
Zedenem
1
Le benchmark provient d'une suite de tests que vous pouvez lire (et vérifier) ​​à partir du repo bluebird git - je les ai à nouveau exécutés localement pour obtenir les résultats ci-dessus car j'avais besoin des résultats de 2017 à partager avec d'autres. Plus important encore, j'ai constaté des gains de performance dans notre propre API (j'ai 5 micro services et un objectif d'évolutivité difficile) et j'ai souvent dû prendre des décisions pour utiliser de simples rappels imbriqués plutôt que des promesses (toujours les plus rapides). Personnellement, je pense que les benchmarks ne sont qu'un premier pas vers une décision mais je ne peux pas encore partager mes données internes ... mon objectif d'échelle est de 10K utilisateurs par machine physique.
SylonZero
En outre, le vote positif n'est guère une mesure complète sur une réponse. D'après mon expérience, beaucoup creusent rarement profondément après qu'un problème a été résolu (ou lu quoi que ce soit d'autre) et de nombreux programmeurs que j'ai encadrés dans le passé avaient besoin d'apprendre les compétences de performance et d'instrumentation pour le code.
SylonZero
Merci beaucoup d'avoir évoqué les problèmes de performances. Je suis un programmeur novice, depuis seulement 2 ans et j'ai envie de cette éducation. J'utilise ceci en production, donc je suis encore plus heureux de savoir si c'est le cas. Quelles sont les meilleures façons de procéder à l'analyse comparative des programmes et des morceaux de code?
Hunter Lester
1
Hunter, cela dépendrait de la nature de la plate-forme et du code mais lié à cette question: il y a deux côtés pour obtenir un aperçu - 1. de bons tests à utiliser via un générateur de charge pour simuler les demandes des utilisateurs. J'utilise Apache jMeter pour tester mon API Node et générer une charge pour plusieurs utilisateurs. 2. Instrumentation: comment suivre les transactions individuelles. J'utilise NewRelic pour instrumenter mon code Node - il donne une ventilation détaillée de chaque transaction en ms (jusqu'à la route Express, le temps de requête Mongo, Redis pour les sessions, etc.). J'espère que cela vous permettra de démarrer.
SylonZero
2

avez-vous essayé cela? Par exemple :

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

si vous créez un modèle à partir d'une instance de mangouste dont la promesse n'a pas été redéfinie - chaque requête sur ce modèle lèverait l'avertissement.

Krishan Kant Sharma
la source
2

Je pense que vous avez votre réponse mais j'utilise global.promise avec gestion des erreurs

// 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);
});
Saurabh Lende
la source
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;
      }
});

Il faut avoir une connexion avec l'aide de la promesse dans la dernière version de mongoose [c'est le lien] [1] [1]: http://mongoosejs.com/docs/promises.html

Yashwin Munsadwala
la source
0

Ajoutez simplement le deuxième paramètre en tant qu'objet à la méthode connect ().

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

Voir: http://mongoosejs.com/docs/connections.html#use-mongo-client

Aaman
la source
Cela seul ne supprime pas l'avertissement. Nous devons également cartographier la promesse mondiale comme mentionné ci-dessus.
Balasubramani M
0

Mangouste 4.8.6

Si vous détectez une erreur comme celle-ci:

(node: 9600) DeprecationWarning: Mongoose: mpromise (la bibliothèque de promesses par défaut de mongoose) est obsolète, branchez votre propre bibliothèque de promesses à la place: http://mongoosejs.com/docs/promises.html

Vous devez également définir les options de la bibliothèque de promesse à utiliser pour le pilote.

mongoose.Promise = global.Promise
mongoose.connect(uri, { useMongoClient: true, options: { promiseLibrary: mongoose.Promise }})
dimpiax
la source
0
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
db = mongoose.connect(env.DATABASE_URI, function(){
  //
})

ce travail pour moi.

Sigit Kuncoro
la source