(вузол: 3341) Застереження Попередження: Мангуст: 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 - це екземпляр класу 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 каже: "Просто зробіть, 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 02

Дякую за вашу редакцію, яка змушує мене усвідомити величезну ваду в роботі
Юсуф Каміль АК

71

Незважаючи на те, що відповідь вище є точним і працює, вам доведеться врахувати проблему продуктивності, якщо у вас є справжня виробнича програма 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');

Контрольні результати

Платформа: (з використанням останнього вузла на момент написання)

  • Linux 4.4.0-59-загальний x64
  • Вузол. JS 6.9.4
  • V8 5.1.281.89
  • Процесор Intel (R) Core (TM) i7-6500U при 2,50 ГГц × 4
  • 16 ГБ оперативної пам'яті та 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     |

1
на моє розуміння: звідки береться ваш орієнтир? Чи існує консенсус щодо цих результатів? Здається, всі голосують за відповідь на обіцянку ES6 за замовчуванням, але я хотів би заглибитися в проблеми продуктивності, про які ви згадали.
Зеденем

1
Орієнтир - з набору тестів, які ви можете прочитати (і перевірити) з репозиторію git bluebird - я запустив їх знову локально, щоб отримати результати вище, оскільки мені потрібні були результати 2017 року, щоб поділитися з іншими. Що ще важливіше, я відчув підвищення продуктивності в нашому власному API (у мене 5 мікросервісів і жорстка ціль масштабованості), і мені доводилося часто приймати рішення щодо використання простих вкладених зворотних викликів за обіцянками (як і раніше найшвидший). Я особисто вважаю, що контрольні показники - це лише перший крок до прийняття рішення, але я поки що не можу поділитися своїми внутрішніми даними ... мій показник масштабу - 10 тис. Користувачів на фізичну машину.
SylonZero

Крім того, голосування навряд чи є повною мірою відповіді. З мого досвіду, багато хто рідко копає глибоко після того, як проблема була вирішена (або прочитала щось інше), і багатьох програмістів, яких я навчав раніше, потрібно було навчити про продуктивність та інструментальні навички для коду.
SylonZero

Щиро дякую, що підняли проблеми з продуктивністю. Я початківець програміст, у мене всього 2 роки, і я жадаю цієї освіти. Я використовую це у виробництві, тому я ще більше радий дізнатися, чи є він. Які найкращі способи використовувати програми тестування та фрагменти коду?
Мисливець Лестер

1
Хантер, це залежатиме від природи платформи та коду, але пов'язано з цим питанням: є дві сторони отримання розуміння - 1. хороші тести для використання через генератор навантаження для імітації запитів користувачів. Я використовую Apache jMeter для тестування мого Node API і для генерації навантаження для кількох користувачів. 2. Інструментарій: як ви відстежуєте окремі транзакції. Я використовую NewRelic для інструментації свого коду Node - він дає детальну розбивку кожної транзакції в мс (до експрес-маршруту, часу запиту 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

Мангуст 4.8.6

Якщо ви виявите таку помилку:

(вузол: 9600) DeprecationПопередження: 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(){
  //
})

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.