Mongoose: DeprecationWarning: Mongoose: mpromise (библиотека обещаний mongoose по умолчанию) устарела в версиях 4.8.0 и 4.8.1

Созданный на 2 февр. 2017  ·  37Комментарии  ·  Источник: Automattic/mongoose

В версиях mongoose 4.8.0 и 4.8.1 (версия узла - 6.9.5 и версия MongoDB - 3.2.11) следующее предупреждение генерируется при первом сохранении документа после запуска приложения (предупреждение не появляется, когда тот же код выполняется в последующие разы после первого раза, пока приложение все еще работает, однако, если приложение закрывается и перезапускается, то при первом сохранении документа после запуска приложения генерируется предупреждение):

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

Эта проблема не возникает при использовании одного и того же кода приложения с mongoose версии 4.7.9 и ранее.

Код, который устанавливает соединение мангуста, выглядит следующим образом:

`// Set up mongoose and DB connection
 var mongoose = require('mongoose');
 mongoose.Promise = require('bluebird');
 mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});`
help wanted needs clarification

Самый полезный комментарий

Как исправить предупреждение об устаревании:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
var schema = new mongoose.Schema({
 // definition
}, {
 // options
});

module.exports = mongoose.model('foobar', schema);

Все 37 Комментарий

Можете ли вы вставить код, который действительно вызывает ошибку? Этот код не будет, потому что вы еще не использовали обещание (если вы не утверждаете, что опубликованный вами фрагмент подключения выдает предупреждение?)

Нет, фрагмент подключения не выдает предупреждения. Следующий фрагмент сохранения newuser - это код, который выдает предупреждение, но только в первый раз, когда код выполняется после запуска приложения (опять же, предупреждение не возникает в версиях mongoose 4.7.9 и ранее):

 `                       var curDate = new Date();

                         var newuser = new user(
                         {                             
                                "userName": userName,
                                "hashed_password": hashed_password,
                                "emailReg": false,
                                "email": "~",
                                "firstName": "",
                                "lastName": "",
                                "address.streetAddress": "",
                                "address.city": "",
                                "address.state": "",
                                "address.postalCode": "",
                                "phoneNumbers": [],
                                "accessLevel": 2,
                                "active": true,
                                "trialStartDate": curDate,
                                "maxStorageByteLimit": constants.maxStorageBytesPerUser,
                                "signUpDate": curDate,
                                "passwordResetDate": curDate,
                                "salt": temp,
                                "storageBytesUsed": 0
                            });

                        if (phoneNumberValid != false)
                        {
                            newuser.phoneNumbers.push({
                                "type": "mobile",
                                "number": contactPhoneNumber,
                                "primary": true
                            });
                        }

                        wlogger.crit("Create new user by UserName: " + userName);

                        newuser.save(function (err)
                        {
                            if (err)
                            {
                                wlogger.error(err + " - when saving user "
                                    + " creation by UserName: " + userName);
                                callback({
                                    "response": false,
                                    "res": "User creation failed. "
                                    + " Please try again or contact us at [email protected]"
                                });
                            }
                            else
                            {
                                wlogger.crit("Saved new user info for UserName: "
                                    + userName);

                                return callback({
                                        "response": true,
                                        "res": "Created user by User Name " + userName,
                                        "user_id": newuser._id,
                                        "last_modified_date": curDate
                                });
                            }
                        })`

Схема пользователя следующая:

`var userSchema = mongoose.Schema({ 
token : String,
email: String,
userName: String,
deviceId: String,
devicePhoneNumber: String, 
hashed_password: String, 
hashed_admin_code: String,
maxStorageByteLimit: { type: Number, default: 1073741824 },
accessLevel: { type: Number, default: 2 },
lastAccessType: Number,
storageBytesUsed: { type: Number, default: 0 },
totalStorageBytesUsed: { type: Number, default: 0 },
deletedStorageBytesUsed: { type: Number, default: 0 },
salt : String,
salt1 : String,
temp_str: String,
syncInProcess: { type: Boolean, default: false },
syncStartDate: { type: Date, default: Date.now },
syncVersion : { type: Number, default: 0 },
active: { type: Boolean, default: false },
disabled: { type: Boolean, default: false },
emailReg: { type: Boolean, default: false },
regPending: { type: Boolean, default: false },
emailChangePending: { type: Boolean, default: false },
regCodeSendCount: { type: Number, default: 0 },
trialStartDate: Date,
signUpDate: Date,
passwordResetDate: Date,
lastLoginDate: Date,
lastModifiedDate: Date,
curLoginDate: Date,
apnDeviceTokens: [ String ],
curSessionIds: [ String ],
curIpAddr: { ipType: String, 
    upper64: Schema.Types.Long,
    lower64: Schema.Types.Long },
firstName: String,
lastName: String,
address: { streetAddress: String,
    city: String,
    state: String, postalCode: String },
phoneNumbers: [ phoneNumbersSchema ],
categories: [ categoriesSchema ],
providerCustomers: [ customerSchema ],
serviceProviders: [ providerSchema ],
ipAddrs: [ ipAddrSchema ],
recentUploads: [ recentUploadSchema ],
recentUploadsGizmo: [ recentUploadSchema ],
recentUploadsLife: [ recentUploadSchema ],
recentUploadsVehicle: [ recentUploadSchema ],
recentUploadsMisc: [ recentUploadSchema ],
recentViews: [ recentViewsSchema ],
recentAdds: [ recentAddsSchema ],
recentAddedFiles: [ recentAddedFilesSchema ],
locations: [ locationSchema ],
inMessages: [ inMessageSchema],
outMessages: [ outMessageSchema ]
  });`

Я могу подтвердить ту же проблему с mongoose v4.8.1 и node.js v7.5.0.

mongoose.Promise = global.Promise;
mongoose.connect(db.mongodb.uri, db.mongodb.options);
DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html

@ stevenelson74708 спасибо за фрагмент, но, вероятно, проблема не в схеме. Я ищу больше, как схема импортируется и используется относительно того, когда соединение открыто / установлен конструктор mongoose Promise.

Схема экспортируется из файла схемы, где она объявлена ​​следующим образом:

`module.exports = mongoose.model('users', userSchema);   `

и схема импортируется в файл, который используется там, где newuser.save вызывается следующим образом:

`var user = require('config/models/users');`

Фрагмент подключения (где соединение открыто и установлен конструктор mongoose Promise), показанный в моем первом посте, встречается в файле app.js, который запускается при инициализации во время запуска приложения.

Фрагмент newuser.save, показанный в моем втором посте, выполняется из файла, в который импортируется схема пользователя, а newuser.save запускается, когда пользователь взаимодействует с приложением и вызывает выполнение определенного маршрута, что происходит после инициализации приложения. завершено.

Предупреждение появляется только в первый раз, когда код newuser.save выполняется после запуска приложения, даже если тот же код newuser.save выполняется много раз после запуска, и предупреждение не появляется с mongoose версии 4.7.9 и ранее.

@ stevenelson74708 Мне нужно будет увидеть все компоненты, которые играют роль в запуске вашего приложения. Многие люди недавно открыли проблемы по этому поводу, и каждая из них возникла из-за неправильной настройки конструктора обещаний, поэтому я предполагаю, что вы делаете что-то не так в том порядке, в котором вы установили mongoose.Promise .

Могу ли я увидеть ваш код?

Ниже приведен весь код (в точном порядке) в инициализации app.js, связанный с конфигурацией mongoose, включая настройку mongoose.Promise. Предупреждение не появляется при выполнении кода инициализации. Предупреждение появляется только при первом запуске кода newuser.save (показанного в моем предыдущем посте) после инициализации приложения. Есть вызовы findOneAndUpdate, которые выполняются перед сохранением, но не вызывают предупреждения, поэтому кажется, что это только функция сохранения вызывает предупреждение.

Конфигурация мангуста - одно из первых, что происходит при инициализации. Должна ли конфигурация мангуста происходить позже при инициализации, например, после функциональности createServer?

Опять же, предупреждение не появляется в версиях mongoose 4.7.9 и более ранних:

`// Set up mongoose and DB connection
var mongoose = require('mongoose');

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});
var conn = mongoose.connection;

conn.once('open', function ()
{
    wlogger.info("Mongoose connection opened on process " + process.pid);
});`

Нет, сначала может быть конфигурация. Является ли этот файл точкой входа для вашего приложения или существует предшествующий ему файл?

Файл app.js - это точка входа для приложения. Приложение можно вызвать, набрав в командной строке node app.js.

У меня такая же проблема с мангустом 4.8.1 и узлом 7.5.0. Я также использую Typescript и пытаюсь подключить Bluebird для обещаний. Я обнаружил, что предупреждение исчезает, если я добавлю этот код:

`import * as mongoose from 'mongoose';
 import * as bluebird from 'bluebird';

 (<any>mongoose).Promise = bluebird;`

в КАЖДОМ файле, который что-то импортирует из "мангуста". Поэтому мне нужно сделать это в каждом файле модели (файле, в котором я определяю свою схему), а не только в файле точки входа.

// Set up mongoose and DB connection
var mongoose = require('mongoose');

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost:27017/basedir', {server: { poolSize: 5 }});
var conn = mongoose.connection;

conn.once('open', function ()
{
    console.log('test');
});

Это предупреждение не выводится, значит, есть еще кое-что.

@vladimirdjurdjevic это означает, что где-то вы используете асинхронную

Я устанавливаю обещание lib, как показано выше, в файле app.js, который является точкой входа в приложение, а затем, когда выполняется первое newuser.save (спустя много времени после установки обещания lib), как показано выше, появляется предупреждение. Newuser.save - это первая асинхронная операция mongoose, которая выполняется, но она выполняется задолго до того, как для соединения установлено обещание lib.

Обещание lib должно быть установлено в каждом файле, который обращается к асинхронным функциям mongoose, в отличие от установки обещания lib только один раз, когда настроено соединение mongoose?

@ stevenelson74708 У меня была такая же проблема. Я думал, что решил это с помощью: mongoose.Promise = global.Promise в точке входа в приложение. Похоже, он вам нужен в каждом файле, который обращается к обещаниям мангуста. Довольно раздражает. Просто установите конфигурацию мангуста в отдельный файл, экспортируйте его и импортируйте в любое место.

Я также недавно заметил, что получаю это предупреждение, хотя я установил обещание в своем файле app.js. Я пробовал использовать как native, так и bluebird с одинаковыми результатами.

// FILE: app.js
import bluebird from 'bluebird';
import mongoose from 'mongoose';

// use bluebird as default promise library
mongoose.Promise = bluebird;

Я импортирую мангуста в несколько своих моделей и использую их в методах схемы. Я решил проблему, установив библиотеку обещаний в файл ever, который импортирует мангуста самостоятельно (см. TODO в приведенном ниже фрагменте). Я не припомню, чтобы несколько месяцев назад я видел предупреждение при аналогичной структуре кода.

// FILE: SessionModel.js
import bluebird from 'bluebird';
import mongoose from 'mongoose';

// TODO: remove this redundant bit of code
// use bluebird as default promise library
mongoose.Promise = bluebird;

SessionSchema.methods.getUser = function(callback) {
  return mongoose.model('User').findById(this.user, callback);
};

@mcfarljw Вам лучше сделать что-нибудь вроде этого:

// config.js
const bluebird = require('bluebird');
const mongoose = require('mongoose');
mongoose.Promise = bluebird;
mongoose.connect('mongodb://localhost:27017/myApp)
module.exports = { mongoose }
// SessionModel.js
const { mongoose } = require('./config')

SessionSchema.methods.getUser = function(callback) {
  return mongoose.model('User').findById(this.user, callback);
};

Так вам не придется много раз писать mongoose.Promise = bluebird :)

В моей ситуации получалось предупреждение об устаревании при работе с вложенными документами с использованием синтаксиса .then() , но не с родительскими документами. Таким образом, случайное предупреждение заставило меня подумать, что у меня проблемы с синтаксисом при работе с дочерними документами, но на самом деле это было отсутствие строки обещания в файле модели, как другие советовали выше.

Да, похоже, что установка mongoose.Promise в файлах схемы, куда экспортируется mongoose.model, устраняет предупреждение в версиях mongoose 4.8 и более поздних.

Да, передача синглтона мангуста в качестве вашего собственного мутировавшего экспорта могла бы обойти проблему, но, по общему признанию, это своего рода взлом.

На данный момент мне неясно, какова именно «правильная» установка / конфигурация мангуста, чтобы избежать предупреждения. Это предупреждение связано с текущими версиями мангуста или указывает на неправильную настройку мангуста? Есть ли рекомендуемая настройка мангуста, которая предотвратит предупреждение? Опять же, это предупреждение появляется только с mongoose версии 4.8.0.

У меня такая же проблема с настройкой глобального мангуста.

Я проследил, он может правильно установить bluebird на обещание_provider, но когда я попытался вернуть обещание, он вернет ES6.

Я просто просмотрел и добавил

mongoose.Promise = global.Promise

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

Это действительно бросает вызов моим, по общему признанию, ограниченным знаниям о том, как работают require и import. У меня создалось впечатление, что независимо от того, сколько раз вам что-то требуется, вы всегда получаете один и тот же экземпляр, поэтому вы подумали бы, что достаточно установить обещание один раз. Так что это немного противоречит интуиции.

Привет
У меня есть пример кода, который вызывает проблему

import mongoose from 'mongoose';

mongoose.Promise = Promise;

import Test from './test.model';

mongoose.connect(uri, options);
mongoose.connection.on('error', err => console.error(`MongoDB connection error: ${err}`));

Test.create({ name: 'Hi'})
  .then(() => Test.findOne({}))
  .then(res => res.save())
  .then(() => console.log('Done'));

(test.model - это простая модель с одним полем для имени)

По какой-то причине проблема сначала появляется при выполнении res.save(); . Без него все работает как обычно.

Я считаю, что эта проблема возникает из-за того, что babel меняет порядок при переносе кода. Когда babel транспилируется, он перемещает весь импорт в начало. Поэтому, когда в моем примере импортируется test.model, библиотека Promise по-прежнему назначается mpromise.

Я использую Node.js 6.10.0 и Mongoose 4.8.5, и у меня возникла эта проблема.

Я сохраняю свой пользовательский объект:

var newUser = User({
    login       : 'john',
    password    : 'secret',
    firstname   : 'John',
    lastname    : 'Doe',
    avatar      : 'avatar.png'
});

newUser.save(function(err){
    if(err) throw err;

    console.log('User created !');
});

И у меня такая же ошибка. Я пробовал так:

mongoose.Promise = require('bluebird');
mongoose.connect(conf.dbpath);

И так:

mongoose.Promise = global.Promise;
mongoose.connect(conf.dbpath);

Но у меня снова устаревшее предупреждение. Как я могу это исправить ?

Как исправить предупреждение об устаревании:

var mongoose = require('mongoose');

mongoose.Promise = global.Promise;
var schema = new mongoose.Schema({
 // definition
}, {
 // options
});

module.exports = mongoose.model('foobar', schema);

Да, это работает, если я вставлю это в свою модель. Итак, мы должны запустить mongoose.Promise внутри каждой модели.

Я думаю, что @ stevenelson74708 отлично подходит, когда говорит At this point it's unclear to me as to exactly what the "proper" mongoose setup/configuration to avoid the warning is.

Да, исправление состояло бы в том, чтобы вернуться ко всем файлам модели мангуста и добавить mongoose.Promise = global.Promise после импорта, но, поскольку эта проблема возникла недавно, было бы неплохо получить более конкретный ответ относительно намерений или причины, стоящие за этим. На данный момент я не уверен, вызвана ли проблема мангустом, бабелем или их комбинацией.

Скорее всего, это обман # 5030. Попробуйте перейти на> = 4.9.1.

Для справки, решение

Сначала решение исходит от @ steve-p-com. Не из @bricss.
@ vkarpov15 такое же предупреждение с 4.9.3.
@stillesjo это ничего с babel. Предупреждение появляется также на нативе без Babel на Node 7.8.0.

У меня нет предупреждений с версии 4.9.3 🌷

Даже когда мы устанавливаем mongoose.Promise = global.Promise; для каждой модели, я думаю, что это не _идеальное_ исправление, верно? Почему бы не использовать по умолчанию global.Promise и не позволить пользователям менять их, если они хотят?

Модульное тестирование моих моделей. Я должен включить его, чтобы мы не видели предупреждения при запуске тестов локально или на CI.
Я использую "mongoose": "4.10.4" с узлом v7.10.0

@lesterzone

Чтобы добавить к этому СУХОЕ решение, настройте его там, где вы инициализируете соединение с базой данных, а не внутри каждой модели.

const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://...');

кажется работает

Однако это не обязательно сработает для всех. Это зависит от структуры вашего кода. Если, например, для файла с кодом подключения требуются модели из отдельных исходных файлов, способ require работает означает, что эти исходные файлы будут загружены до того, как глобальное обещание будет установлено в файле, содержащем код подключения. Эти модели по-прежнему будут использовать для обещания значение по умолчанию. Безопасный путь - просто установить глобальное обещание в каждом исходном файле, для которого требуется mongoose.

это работает для меня
`` ''
импортный мангуст из «мангуста»;
импортировать конфигурацию из './config';
импортировать синюю птицу из "синей птицы";

экспорт обратного вызова по умолчанию => {
мангуст.Promise = bluebird;
// подключаемся к базе данных из экземпляра базы данных в файле конфигурации
пусть db = mongoose.connect (config.mongoUrl, {useMongoClient: true});
обратный вызов (дб);
}
`` ''

Вот так я и делаю.

var colors = require('colors');
var mongo = require('mongodb');
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

var db = mongoose.connection;

mongoose.connect('mongodb://localhost:27017/db', { useMongoClient: true })
.then(function(){
  console.log(" Connected to dbName ".green);

}).catch(err => console.error(err));

Вы должны использовать функцию .create, которая поставляется с мангустом, а не с .save,
Я поменял свой, и это решает проблему

Я использую 4.13.9, и он все еще существует. Решение @ Gilbert136 исправляет это, хотя мне кажется странным. .create вызывает .save, так почему же тогда нет предупреждения об устаревании?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги