(узел:3341) предупреждение об устаревании: Мангуст: mpromise
Я пытаюсь разработать класс на вершине мангуста с помощью моих пользовательских методов, поэтому я расширил мангуста своим собственным классом, но когда я вызываю для создания нового метода car, он работает, но его полоса и ошибка, здесь я позволяю вам видеть, что я пытаюсь сделать.
Я получаю это предупреждение
(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
после того, как я делаю
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;
}
}
любые мысли о том, что я делаю не так?
8 ответов:
вот что сработало для меня, чтобы прояснить проблему, после прочтения документов: http://mongoosejs.com/docs/promises.html
пример в документе использует библиотеку обещаний bluebird, но я решил пойти с родными обещаниями ES6.
в файле, куда я звоню
mongoose.connect
:mongoose.Promise = global.Promise; mongoose.connect('mongodb://10.7.0.3:27107/data/db');
[EDIT: спасибо @SylonZero за то, что поднял недостаток производительности в моем ответе. Поскольку этот ответ так сильно рассматривается, я чувствую себя обязанным сделать это редактировать и поощрять использование
bluebird
вместо родных обещаний. Пожалуйста, прочитайте ответ ниже для более образованных и опытных деталей. ]
в то время как ответ выше является точным и работает, вы должны учитывать вопрос производительность если у вас есть реальный, производственный узел приложения.
решение выше будет использовать собственные обещания ES6-которые 4X медленнее чем bluebird в тестах я поделился ниже. Это может существенно повлиять на производительность API, написанного в узле и использующего 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');
Эталон Результаты
платформа: (используя последний узел на момент написания)
- Linux 4.4.0-59-generic x64
- узел.JS 6.9.4
- V8 5.1.281.89
- Intel(R) Core (TM) i7-6500U CPU @ 2.50 GHz × 4
- 16 ГБ оперативной памяти С 500 ГБ 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 |
вы пробовали это? Например:
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
Если вы создадите модель из экземпляра мангуста, чье обещание не было переопределено - каждый запрос на этой модели выдаст предупреждение.
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; } });
нужно иметь связь с помощью promise в последней версии мангуста [это ссылка][1] [1]: http://mongoosejs.com/docs/promises.html
просто добавьте второй параметр в качестве объекта в метод connect ().
mongoose.connect('dbUrl', { useMongoClient: true });
см.:http://mongoosejs.com/docs/connections.html#use-mongo-client
Я думаю, что у вас есть свой ответ, но я использую глобальные.обещай С обработки ошибок
// 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); });
Мангуст 4.8.6
Если вы поймаете ошибку, как это:
(узел:9600) предупреждение об устаревании: Мангуст: mpromise (мангуст по умолчанию библиотека обещаний) устарела, подключите свою собственную библиотеку обещаний вместо этого: http://mongoosejs.com/docs/promises.html
Вам также нужно установить параметры, которые обещают использовать библиотеку для драйвера.
mongoose.Promise = global.Promise mongoose.connect(uri, { useMongoClient: true, options: { promiseLibrary: mongoose.Promise }})