(node: 3341) Устаревание Предупреждение: Mongoose: mpromise
Я triyng, чтобы разработать класс на вершине mongoose с моими собственными методами, поэтому я расширяю мангуст с моим собственным классом, но когда я вызываю создание нового метода автомобиля, он работает, но его полоса и ошибка, здесь я позволяю вы видите, что я пытаюсь сделать.
Я получаю это предупреждение
(node:3341) DeprecationWarning: Mongoose: mpromise (mongoose default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html
после
driver.createCar({
carName: 'jeep',
availableSeats: 4,
}, callback);
драйвер - это пример класса драйвера
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;
}
}
любые мысли о том, что я делаю неправильно?
Ответы
Ответ 1
Вот что помогло мне решить проблему, прочитав документы:
http://mongoosejs.com/docs/promises.html
Пример в документе использует библиотеку обещаний bluebird, но я решил пойти с родным ES6 promises.
В файле, где я звоню mongoose.connect
:
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://10.7.0.3:27107/data/db');
[EDIT: Спасибо @SylonZero за то, что в моем ответе возникла ошибка производительности. Поскольку этот ответ так сильно рассмотрен, я чувствую чувство долга, чтобы сделать это редактирование и поощрять использование bluebird
вместо native promises. Пожалуйста, прочитайте ответ ниже этого для более образованных и опытных деталей. ]
Ответ 2
В то время как вышеприведенный ответ является точным и работает, вы должны учитывать проблему Производительность, если у вас есть реальное, производственное приложение Node.
В приведенном выше решении будет использоваться собственный ES6 promises - 4X медленнее, чем bluebird в тестах, которые я рассказывал ниже. Это может существенно повлиять на производительность API, написанного в Node, и использовать MongoDb.
Я рекомендую использовать 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');
Результаты тестов
Платформа: (используя последний Node в момент написания)
- Linux 4.4.0-59-generic x64
- Node.JS 6.9.4
- V8 5.1.281.89
- Intel (R) Core (TM) i7-6500U CPU @2.50GHz × 4
- ОЗУ 16 ГБ с SSD объемом 500 ГБ
| 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 |
Ответ 3
Вы попробовали это?
Например:
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
если вы создаете модель из экземпляра mongoose, обещание которой не было переопределено - каждый запрос этой модели будет вызывать предупреждение.
Ответ 4
Просто добавьте второй параметр в качестве объекта метода connect().
mongoose.connect('dbUrl', {
useMongoClient: true
});
Смотрите: http://mongoosejs.com/docs/connections.html#use-mongo-client
Ответ 5
Я думаю, что у вас есть ответ, но я использую global.promise с обработкой ошибок
// 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);
});
Ответ 6
Mongoose 4.8.6
Если вы поймаете ошибку следующим образом:
(node: 9600) Депрессия Предупреждение: Mongoose: mpromise (mongoose default библиотека обещаний) устарела, подключите свою собственную библиотеку обещаний вместо этого: http://mongoosejs.com/docs/promises.html
Вам также нужно установить опции, которые обещают библиотеке для использования драйвером.
mongoose.Promise = global.Promise
mongoose.connect(uri, { useMongoClient: true, options: { promiseLibrary: mongoose.Promise }})