(узел: 3341) DeprecationWarning: Mongoose: mpromise

89

Я пытаюсь разработать класс поверх мангуста с моими пользовательскими методами, поэтому я расширил мангуста своим собственным классом, но когда я вызываю для создания нового метода автомобиля, он работает, но его полоса и ошибка, здесь я позволяю вам посмотреть, что я пытаюсь сделать.

Я получаю это предупреждение

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

драйвер - это экземпляр класса 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;
 }
}

какие-нибудь мысли о том, что я делаю не так?

Одель О. Гутьеррес
источник
3
Автор «Мангуста» говорит: «Просто сделай это, mongoose.Promise = global.Promiseи ты больше не должен получать это предупреждение». github.com/Automattic/mongoose/issues/…
efkan

Ответы:

240

Вот что помогло мне прояснить проблему после прочтения документации: http://mongoosejs.com/docs/promises.html

В примере в документе используется библиотека обещаний bluebird, но я решил использовать собственные обещания ES6.

В файле, куда я звоню mongoose.connect:

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

[РЕДАКТИРОВАТЬ: Спасибо @SylonZero за то, что в моем ответе был замечен недостаток производительности. Поскольку этот ответ очень популярен, я чувствую себя обязанным внести это изменение и поощрять использование bluebirdвместо собственных обещаний. Пожалуйста, прочтите ответ под этим, чтобы получить более подробную информацию. ]

Хантер Лестер
источник
3
После проверки тест на веб - сайте: bluebirdjs.com/docs/benchmarks.html @SylonZero имеет в виду, я действительно полагаю , что его решение в ценности , чтобы до голосования вместо первого предложения. Я до сих пор благодарю Хантера Лестера за эту отличную работу, исследования и за то, что поделился своими открытиями!
Isak La Fleur
Спасибо за ваше редактирование, которое заставило меня осознать огромный недостаток производительности
Юсуф Камил АК
72

Хотя приведенный выше ответ точен и работает, вы должны учитывать проблему производительности, если у вас есть реальное производственное приложение Node.

В приведенном выше решении будут использоваться собственные обещания ES6, которые в 4 раза медленнее, чем 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-общий x64
  • Node.JS 6.9.4
  • V8 5.1.281.89
  • Intel (R) Core (TM) i7-6500U CPU @ 2,50 ГГц × 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     |
SylonZero
источник
1
для моего понимания: откуда берется ваш тест? Есть ли консенсус по поводу этих результатов? Кажется, что все голосуют за ответ на обещание ES6 по умолчанию, но я хотел бы глубже покопаться в упомянутых вами проблемах с производительностью.
Zedenem 01
1
Тест взят из набора тестов, которые вы можете прочитать (и проверить) из репозитория bluebird git - я снова запустил их локально, чтобы получить результаты выше, потому что мне нужны были результаты 2017 года, чтобы поделиться с другими. Что еще более важно, я испытал повышение производительности в нашем собственном API (у меня есть 5 микросервисов и жесткая цель масштабируемости), и мне часто приходилось принимать решения об использовании простых вложенных обратных вызовов вместо обещаний (все еще самых быстрых). Я лично считаю, что тесты - это только первый шаг к принятию решения, но я пока не могу поделиться своими внутренними данными ... моя цель по масштабу - 10 тысяч пользователей на физическую машину.
SylonZero 01
Кроме того, голосование не является полной мерой по поводу ответа. По моему опыту, многие редко копают глубоко после того, как проблема была решена (или читала что-нибудь еще), и многих программистов, которых я обучал в прошлом, нужно было обучить производительности и навыкам инструментария для кода.
SylonZero 01
1
Большое спасибо за то, что подняли вопрос о производительности. Я начинающий программист, у меня всего 2 года, и я очень хочу получить это образование. Я использую это в продакшене, поэтому даже более рад узнать, есть ли это. Как лучше всего проводить тестирование программ и фрагментов кода?
Хантер Лестер
1
Хантера, это будет зависеть от природы платформы и кода, но связано с этим вопросом: есть две стороны понимания: 1. Хорошие тесты для использования с генератором нагрузки для имитации пользовательских запросов. Я использую Apache jMeter для тестирования моего Node API и создания нагрузки для нескольких пользователей. 2. Инструменты: как вы отслеживаете отдельные транзакции. Я использую NewRelic для инструментария моего кода узла - он дает подробную разбивку каждой транзакции в мс (вплоть до маршрута Express, времени запроса Mongo, Redis для сеансов и т. Д.). Надеюсь, это поможет вам.
SylonZero 02
2

ты пробовал это? Например :

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

если вы создаете модель из экземпляра мангуста, обещание которого не было переопределено - каждый запрос этой модели будет выдавать предупреждение.

Кришан Кант Шарма
источник
2

Думаю, у вас есть ответ, но я использую 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);
});
Саураб Ленде
источник
1
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;
      }
});

В последней версии mongoose нужно иметь соединение с помощью обещания [это ссылка] [1] [1]: http://mongoosejs.com/docs/promises.html

Яшвин Мунсадвала
источник
0

Просто добавьте второй параметр как объект в метод connect ().

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

Увидеть: Http://mongoosejs.com/docs/connections.html#use-mongo-client

Аман
источник
Одно это не снимает предупреждения. Нам также необходимо отобразить глобальное обещание, как упомянуто выше.
Balasubramani M
0

Мангуст 4.8.6

Если вы поймаете такую ​​ошибку:

(узел: 9600) DeprecationWarning: Mongoose: mpromise (библиотека обещаний mongoose по умолчанию) устарела, вместо этого подключите свою собственную библиотеку обещаний: http://mongoosejs.com/docs/promises.html

Вам также необходимо указать в параметрах, какую библиотеку обещаний использовать для драйвера.

mongoose.Promise = global.Promise
mongoose.connect(uri, { useMongoClient: true, options: { promiseLibrary: mongoose.Promise }})
димпиакс
источник
0
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
db = mongoose.connect(env.DATABASE_URI, function(){
  //
})

эта работа для меня.

Сигит Кункоро
источник