it-swarm.com.de

(Knoten: 3341) DeprecationWarning: Mongoose: Kompromiss

Ich versuche, eine Klasse auf der Oberseite des Mungos mit meinen benutzerdefinierten Methoden zu entwickeln, also habe ich den Mungo um eine eigene Klasse erweitert. Wenn ich jedoch eine neue Fahrzeugmethode erstellt habe, funktioniert sie, aber es funktioniert nur mit dem Streifen und dem Fehler Sehen Sie, was ich versuche.

Ich bekomme diese Warnung

(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

nachdem ich es getan habe

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

driver ist eine Instanz der Klasse 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;
 }
}

irgendwelche Gedanken darüber, was ich falsch mache?

85

Nachdem ich die Dokumente gelesen hatte, funktionierte ich für die Lösung des Problems: http://mongoosejs.com/docs/promises.html

Das Beispiel im Dokument verwendet die Bluebird-Versprechenbibliothek, aber ich habe mich für native ES6-Versprechen entschieden.

In der Datei, in der ich mongoose.connect anrufe:

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

[EDIT: Danke an @SylonZero, dass ich in meiner Antwort einen Performance-Fehler gefunden habe. Da diese Antwort sehr geschätzt wird, fühle ich mich verpflichtet, diese Bearbeitung vorzunehmen und die Verwendung von bluebird anstelle von nativen Versprechen zu fördern. Bitte lesen Sie die Antwort unten für mehr gebildete und erfahrene Details. ]

232
Hunter Lester

Die obige Antwort ist zwar korrekt und funktioniert, Sie müssen jedoch das Problem Performance berücksichtigen, wenn Sie eine echte Produktionsknoten-App haben.

Die obige Lösung verwendet native ES6-Versprechen - die 4X langsamer als Bluebird in den Benchmarks sind, die ich unten geteilt habe. Dies kann die Leistung einer in Node geschriebenen API und der Verwendung von MongoDB erheblich beeinträchtigen.

Ich empfehle 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');

Benchmark-Ergebnisse

Plattform: (unter Verwendung des neuesten Knotens zum Zeitpunkt des Schreibens)

  • Linux 4.4.0-59-generisches x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • Intel® Core (TM) i7-6500U-CPU bei 2,50 GHz × 4
  • 16 GB RAM mit 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     |
66
SylonZero

hast du das probiert? Zum Beispiel: 

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

wenn Sie ein Modell aus einer Moose-Instanz erstellen, wurde das Versprechen nicht neu definiert - jede Abfrage dieses Modells würde die Warnung auslösen.

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

Man muss in der neuesten Version von mongoose mit Hilfe des Versprechens Verbindung haben [das ist der Link] [1] [1]: http://mongoosejs.com/docs/promises.html

1

Mungo 4.8.6

Wenn Sie einen Fehler wie folgt feststellen: 

(node: 9600) DeprecationWarning: Mongoose: mpromise (mongosos voreingestellte Versprechenbibliothek) ist veraltet. Schließen Sie Ihre eigene Versprechenbibliothek an. stattdessen: http://mongoosejs.com/docs/promises.html

Sie müssen auch Optionen festlegen, die die Bibliothek für den Treiber versprechen.

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

Fügen Sie einfach den zweiten Parameter als Objekt zur Methode connect () hinzu.

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

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

diese Arbeit für mich.

0
sgtkuncoro

Ich denke, Sie haben Ihre Antwort, aber ich benutze global.promise mit Fehlerbehandlung

// 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