web-dev-qa-db-fra.com

(node: 3341) DeprecationWarning: Mongoose: mpromise

J'essaie de développer une classe sur le dessus de la mangouste avec mes méthodes personnalisées, alors j'ai étendu la mangouste avec ma propre classe, mais lorsque j'invoque pour créer une nouvelle méthode de voiture, cela fonctionne, mais sa bande et erreur, ici je vous laisse vois 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 idées sur ce que je fais mal?

85
Audel O. Gutierrez

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

L'exemple de la documentation utilise la bibliothèque de promesses bluebird, mais j'ai choisi 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 signalé un problème de performance dans ma réponse. Étant donné que cette réponse suscite un vif intérêt, je sens le devoir de faire ce montage et d’encourager l’utilisation de bluebird au lieu de promesses autochtones. S'il vous plaît lire la réponse ci-dessous celui-ci pour plus de détails instruits et expérimentés. ]

232
Hunter Lester

Bien que la réponse ci-dessus soit exacte et fonctionne, vous devez prendre en compte le problème de Performance si vous avez une application Node de production réelle.

La solution ci-dessus utilisera les promesses ES6 natives - qui sont 4X plus lentes que bluebird dans les tests de performances 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: (utilisant le dernier nœud au moment de la rédaction)

  • Linux 4.4.0-59-générique x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • CPU i7-6500U Intel (R) Core (TM) à 2,50 GHz × 4
  • 16 Go RAM avec SSD de 500 Go

    | 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     |
66
SylonZero

avez-vous essayé ceci? 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 mangouste dont la promesse n'a pas été redéfinie, chaque requête de ce modèle génère l'avertissement.

2
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 établir une connexion avec l’aide de promise dans la dernière version de mangouste [c’est le lien] [1] [1]: http://mongoosejs.com/docs/promises.html

1
Yashwin Munsadwala

Mongoose 4.8.6

Si vous voyez une erreur comme ceci: 

(node: 9600) DeprecationWarning: Mongoose: mpromise (la bibliothèque par défaut de mongoose promise) est obsolète. Branchez votre propre bibliothèque de promesses. au lieu de cela: http://mongoosejs.com/docs/promises.html

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

mongoose.Promise = global.Promise
mongoose.connect(uri, { useMongoClient: true, options: { promiseLibrary: mongoose.Promise }})
0
dimpiax

Ajoutez simplement le second paramètre sous forme d'objet à la méthode connect ().

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

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

0
Aaman
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
db = mongoose.connect(env.DATABASE_URI, function(){
  //
})

cela fonctionne pour moi.

0
sgtkuncoro

Je pense que vous avez votre réponse mais j'utilise global.promise avec traitement 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);
});
0
Saurabh Lende