(node:3341) BeëindigingWaarschuwing: Mongoose: mpromise

Ik probeer een klasse op de top van de mangoest te ontwikkelen met mijn aangepaste methoden, dus ik heb de mangoest uitgebreid met mijn eigen klasse, maar wanneer ik aanroep om een ​​nieuwe automethode te maken, werkt het, maar de strip en fout, hier Ik laat je zien wat ik probeer te doen.

Ik krijg deze waarschuwing

(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

nadat ik dat doe

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

driver is een instantie van Driver class

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

enige gedachten over wat ik verkeerd doe?


Antwoord 1, autoriteit 100%

Dit is wat voor mij werkte om het probleem op te lossen, na het lezen van documenten:
http://mongoosejs.com/docs/promises.html

Het voorbeeld in het document gebruikt de bluebird-beloftebibliotheek, maar ik heb ervoor gekozen om met native ES6-beloften te gaan.

In het bestand waarin ik mongoose.connectbel:

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

[EDIT: Bedankt aan @SylonZero voor het naar voren brengen van een prestatiefout in mijn antwoord. Aangezien dit antwoord zo gewaardeerd wordt, voel ik me plicht om deze bewerking uit te voeren en het gebruik van bluebirdaan te moedigen in plaats van native beloften. Lees het antwoord hieronder voor meer opgeleide en ervaren details. ]


Antwoord 2, autoriteit 30%

Hoewel het bovenstaande antwoord juist is en werkt, moet je rekening houden met het probleem van Performanceals je een echte productie-Node-app hebt.

De bovenstaande oplossing maakt gebruik van native ES6-beloftes – die 4X langzamerzijn dan bluebird in de benchmarks die ik hieronder heb gedeeld. Dit kan de prestaties van een API die in Node is geschreven en MongoDB gebruikt, drastisch beïnvloeden.

Ik raad aan om Bluebird te gebruiken:

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

Benchmarkresultaten

Platform: (gebruikt de nieuwste Node op het moment van schrijven)

  • Linux 4.4.0-59-generiek x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • Intel(R) Core(TM) i7-6500U CPU @ 2,50GHz × 4
  • 16 GB RAM met 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     |

Antwoord 3

heb je dit geprobeerd?
Bijvoorbeeld:

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

Als u een model maakt van een mangoest-instantie waarvan de belofte niet opnieuw is gedefinieerd, zou elke query op dit model de waarschuwing geven.


Antwoord 4

Ik denk dat je je antwoord hebt, maar ik gebruik global.promisemet foutafhandeling

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

Antwoord 5

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

Men moet verbinding hebben met de hulp van belofte in de nieuwste versie van mangoest [dit is de link][1]
[1]: http://mongoosejs.com/docs/promises.html


Antwoord 6

Voeg gewoon de tweede parameter toe als een object aan de connect() methode.

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

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


Antwoord 7

Mangoest 4.8.6

Als u een dergelijke fout opmerkt:

(node:9600) BeëindigingWaarschuwing: Mongoose: mpromise (standaard van mangoest
beloftebibliotheek) is verouderd, sluit uw eigen beloftebibliotheek aan
in plaats daarvan: http://mongoosejs.com/docs/promises.html

Je moet ook opties instellen die de bibliotheek beloven te gebruiken voor de bestuurder.

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

Other episodes