После обновления до версии 5.2.9
я все время получаю это сообщение в консоли, когда запускаю свое веб-приложение:
DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
И я не пользуюсь ни тем, ни другим.
дубликат № 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)
должен остановить это предупреждение, как показано в этом примере:
#!/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
константное приложение = требуется('../приложение')
константная конфигурация = требуется ('../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, но это не избавило от предупреждения. Только установка его в маршрут прошла успешно.
~>: 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 вы можете обернуть мангуста в собственный файл, например
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); исправил мою проблему
Я собираюсь заблокировать эту проблему. Для дальнейшего использования см. руководство по устареванию в нашей документации .
Самый полезный комментарий
После обновления до версии 5.2.10. Любой из приведенных ниже вариантов должен остановить предупреждения?
js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
или
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Здесь это не сработало. (Извините, если я что-то не так сделал)