Mongoose: DeprecationWarning: collection.ensureIndex устарел. Вместо этого используйте createIndexes.

Созданный на 18 авг. 2018  ·  32Комментарии  ·  Источник: Automattic/mongoose

После обновления до версии 5.2.9 я все время получаю это сообщение в консоли, когда запускаю свое веб-приложение:

DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

И я не пользуюсь ни тем, ни другим.

enhancement

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

После обновления до версии 5.2.10. Любой из приведенных ниже вариантов должен остановить предупреждения?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
или
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Здесь это не сработало. (Извините, если я что-то не так сделал)

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

дубликат № 6880

Спасибо, что нашли время сообщить о проблеме @bricss. Mongoose вызывает ensureIndex() внутри. Вы можете спокойно проигнорировать это предупреждение, отключить его с помощью флага узла --no-deprecation или перейти на версию 5.2.8, если в версии 5.2.9 нет конкретных исправлений, на которые вы полагались. Следите за обновлениями #6880 👍

,unique: true,index: true находится в одном поле в одной из моих схем, и это вызывает это предупреждение. Вопрос, как обеспечить уникальное значение без получения этого предупреждения.

@nonniv обновите до 5.2.10 и установите mongoose.set('useCreateIndex', true);

После обновления до версии 5.2.10. Любой из приведенных ниже вариантов должен остановить предупреждения?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
или
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Здесь это не сработало. (Извините, если я что-то не так сделал)

@samuelcecilio, какие конкретные предупреждения об устаревании вы видите? В комментарии, который открыл #6922, есть несколько полезных заметок, или не стесняйтесь делиться своими конкретными предупреждениями здесь, и я посмотрю, смогу ли помочь.

(node:9125) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

@samuelcecilio mongoose.set('useCreateIndex', true) должен остановить это предупреждение, как показано в этом примере:

6922.js

#!/usr/bin/env node
'use strict';

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
mongoose.set('useCreateIndex', true);

const conn = mongoose.connection;
const Schema = mongoose.Schema;

const schema = new Schema({
  name: {
    type: String,
    unique: true
  }
});

const Test = mongoose.model('test', schema);

const test = new Test({ name: 'one' });

async function run() {
  console.log(`mongoose version: ${mongoose.version}`);
  await conn.dropDatabase();
  await test.save();
  return conn.close();
}

run();

Вывод:

issues: ./6922.js
mongoose version: 5.2.10
issues:

вы уверены, что ваш проект использует 5.2.10? есть ли в вашем проекте другие пакеты, использующие другие версии мангуста и т. д.?

Привет, спасибо за ответ. Да, я проверил версию три раза, лол:

$ npm list --depth=0 ... [email protected] ...

Мой код

app.js
````js
...

константная конфигурация = требуется ('./config')
const мангуст = требуется ('мангуст')
константный экспресс = требуется ('экспресс')
постоянное приложение = экспресс()

mongoose.connect (config.dbUri, {useNewUrlParser: true})
mongoose.set('useCreateIndex', правда)

....

модуль.экспорт = приложение
````

бин/www
````js

!/usr/bin/env узел

константное приложение = требуется('../приложение')
константная конфигурация = требуется ('../config')
константа отладки = требуется ('отладка') ('блиц')
константный http = требуется('http')
постоянный порт = normalizePort(process.env.PORT || config.port)
const мангуст = требуется ('мангуст')

app.set('порт', порт)

постоянный сервер = http.createServer(приложение)

server.listen(порт)
server.on('ошибка', onError)
server.on('прослушивание', onListening)

константа монго = мангуст.соединение

mongo.on('ошибка', error => { debug('mongo: ' + error.name) })
mongo.on('подключено', () => {отладка('монго: подключено') })
mongo.on('отключено', () => {отладка('монго: отключено') })

....
````

Когда я запускаю DEBUG=blitz* npm run dev

````баш

нодмон бин/www

[узел] 1.18.3
[nodemon] для перезапуска в любое время введите rs
[nodemon] смотрит: .
[nodemon] начиная с node bin/www
блиц Прослушивание порта 3000 +0мс
блиц монго: подключено +14 мс
(узел: 10622) Предупреждение об устаревании: collection.ensureIndex устарел. Вместо этого используйте createIndexes.
````

@samuelcecilio , может быть, вместо этого переместите mongoose.set('useCreateIndex', true) в файл bin/www ? Я также настрою экспресс-пример и проверю.

@samuelcecilio, поиграв с этим, я обнаружил, что мне нужно установить для useCreateIndex значение true в файле маршрута, содержащем модель. В моем случае, после использования экспресс-инструмента cli, мне нужно было установить useCreateIndex в маршруте индекса, показанном ниже:

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
const Test = mongoose.model('test', { name: {type: String, unique: true }});

/* GET home page. */
router.get('/', function(req, res, next) {
  Test.create({ name: 'billy' }).then((doc) => {
    return res.status(200).json({ done: true, test: doc.id });
  }).catch((e) => {
    return res.status(500).json({ err: e });
  });
});

module.exports = router;

без опции, установленной в индексном маршруте, я получил:

[nodemon] starting `node bin/www`
version: 5.2.10
(node:17042) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

после установки опции в маршруте я получил:

[nodemon] starting `node bin/www`
version: 5.2.10
^C

Я попытался установить его в bin/www, но это не избавило от предупреждения. Только установка его в маршрут прошла успешно.

вывод керлинга localhost

~>: curl localhost:3000/
{"done":true,"test":"5b84a4e13ec72e4352475426"}~>: 
~>: 

Я использую отдельные файлы для пользователей, клиентов, поставщиков, заказов, товаров.

Это остановило предупреждение:

модели /user.js
````js
const addressSchema = require('./address')
const profileSchema = require('./profile')
const uuidv4 = требуется ('uuid/v4')
const мангуст = требуется ('мангуст')
const Schema = мангуст.Схема

mongoose.set('useCreateIndex', правда)

const userSchema = новая схема({
отключено: {тип: Boolean, по умолчанию: false},
роли: {тип: Массив, по умолчанию: ['помощник']},
идентификатор: {тип: строка, уникальный: истина, обязательный: истина},
имя пользователя: {тип: строка, уникальный: истина, обязательный: истина},
имя: { тип: строка, верхний регистр: истина, обязательно: истина},
пароль: {тип: строка, обязательный: true},
секрет: строка,
профиль: схема профиля,
адрес: адресСхема,
Дата создания,
изменено: Дата
}, {
коллекция: 'пользователи'
})

userSchema.pre('сохранить', функция (далее) {
константный документ = это
doc.created = Дата.сейчас()
doc.modified = Дата.сейчас()
doc.secret = uuidv4()
следующий()
})

module.exports = mongoose.model('Пользователь', userSchema)

````

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

@samuelcecilio вы можете обернуть мангуста в собственный файл, например

мойМангуст.js

const mongoose = require('mongoose')
mongoose.set('useCreateIndex', true);
//etc
module.exports = mongoose

а затем везде требовать свою обертку const mongoose = require('myMongoose') вместо мангуста. Это, вероятно, что-то вроде того, что мне придется делать, когда я начну обновление после 5.2.8.

Тем не менее мне придется изменить все текущие файлы. Для каждого файла в папке models я бы заменил require ('mongoose') на require('myMongoose') . То же самое относится к app.js и bin/www .

Вопрос: в будущей версии mongoose мне не нужно будет включать mongoose.set ('useCreateIndex', true) или это будет нормально, для проблем совместимости со старыми версиями mongo, node и т.д...?

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

На данный момент я добавил mongoose.set('useCreateIndex', true) ко всем файлам, содержащим require('mongoose') . Я думаю об использовании обертки ('./myMongoose') или ('./mongoose-custom') . Что вы думаете?

Это должно быть глобальным? Это экспресс-выпуск?

Очень неудобно добавлять mongoose.set('useCreateIndex', true) в каждый файл, содержащий объявления модели.
Почему бы не заставить его работать с опциями connect или установить его перед подключением?

@samuelcecilio @bricss Согласен. Повторное открытие для изучения возможных решений.

Вам не нужно помещать это в каждый файл, но, к сожалению, похоже, что сейчас вам нужно поместить mongoose.set('useCreateIndex', true) перед любыми вызовами mongoose.model(). Это сложно, если вы экспортируете модели, а не схемы. Добавлю исправление для этого.

После обновления до версии 5.2.13 это должно остановить предупреждения? Спасибо

javascript mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })

bash the options [useCreateIndex] is not supported server: listening on port 3000 +0ms mongo: Connected +34ms (node:18457) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

@samuelcecilio useCreateIndex не является вариантом подключения, но пока вы вызываете mongoose.set('useCreateIndex', true); перед вызовом mongoose.model() (даже в других файлах), все последующие вызовы mongoose.model должны откатиться к опции, которую вы установили с помощью mongoose.set() . Я протестировал 5.2.13 с моим примером выше, вместо этого вызывая mongoose.set('useCreateIndex', true) в файле bin/www, а не в моем маршруте. Теперь это работает.

Работает с 5.2.13 после подключения и до всех остальных файлов.

Это соединение в моем файле db.js:

// Create the database connection
mongoose.connect(encodeMongoURI(dbURI), options);
mongoose.set('useCreateIndex', true);

У меня есть соединение с монго в отдельном скрипте. Таким образом, я просто вызываю mongoose.set('useCreateIndex', true); прямо перед тем, как подключиться к монго. Тогда нет необходимости указывать его ни в одном из объявлений моей модели.

Предложение @LucHighwalker - правильный способ сделать это. В идеале вы помещаете все эти глобальные параметры прямо перед вызовом mongoose.connect() .

Есть ли функциональная разница между

mongoose.connect(encodeMongoURI(dbURI), options);
mongoose.set('useCreateIndex', true);

и

mongoose.set('useCreateIndex', true);
mongoose.connect(encodeMongoURI(dbURI), options);

? Потому что оба, кажется, отлично работают в 5.2.17.

mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })

Работает с последней версией

Хорошо, я думаю, @types/mongoose — это несколько версий позади (пока не работает с машинописным текстом).

mongoose.connect(url, { useNewUrlParser: true, autoIndex: false })

Ответ @Dionesio помог мне. Спасибо!

mongoose.connect("mongodb://localhost:27017/test", {useNewUrlParser: true});
mongoose.set('useCreateIndex', правда);

Это решило все мои предупреждения об устаревании.

@samuelcecilio, поиграв с этим, я обнаружил, что мне нужно установить для useCreateIndex значение true в файле маршрута, содержащем модель. В моем случае, после использования экспресс-инструмента cli, мне нужно было установить useCreateIndex в маршруте индекса, показанном ниже:

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
mongoose.set('useCreateIndex', true);
const Test = mongoose.model('test', { name: {type: String, unique: true }});

/* GET home page. */
router.get('/', function(req, res, next) {
  Test.create({ name: 'billy' }).then((doc) => {
    return res.status(200).json({ done: true, test: doc.id });
  }).catch((e) => {
    return res.status(500).json({ err: e });
  });
});

module.exports = router;

без опции, установленной в индексном маршруте, я получил:

[nodemon] starting `node bin/www`
version: 5.2.10
(node:17042) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

после установки опции в маршруте я получил:

[nodemon] starting `node bin/www`
version: 5.2.10
^C

Я попытался установить его в bin/www, но это не избавило от предупреждения. Только установка его в маршрут прошла успешно.

вывод керлинга localhost

~>: curl localhost:3000/
{"done":true,"test":"5b84a4e13ec72e4352475426"}~>: 
~>: 

Спасибо - добавление mongoose.set('useCreateIndex', true); исправил мою проблему

Я собираюсь заблокировать эту проблему. Для дальнейшего использования см. руководство по устареванию в нашей документации .

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