Mongoose: DeprecationWarning : collection.ensureIndex est obsolète. Utilisez plutôt createIndexes.

Créé le 18 août 2018  ·  32Commentaires  ·  Source: Automattic/mongoose

Après la mise à jour vers la version 5.2.9 , je reçois tout le temps ce message dans la console, lorsque je démarre mon application Web :

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

Et je n'utilise ni l'un ni l'autre.

enhancement

Commentaire le plus utile

Après la mise à niveau vers la version 5.2.10. L'une des options ci-dessous devrait arrêter les avertissements ?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
ou
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Cela n'a pas fonctionné ici. (Désolé si j'ai fait quelque chose de mal)

Tous les 32 commentaires

duplicata de #6880

Merci d'avoir pris le temps de signaler le problème @bricss. Mongoose appelle ensureIndex() en interne. Vous pouvez ignorer l'avertissement en toute sécurité pour l'instant, ou le désactiver avec l'indicateur de nœud --no-deprecation , ou rétrograder à 5.2.8 s'il n'y a pas de correctifs spécifiques dans 5.2.9 sur lesquels vous comptiez. Suivez #6880 pour les mises à jour 👍

,unique: true,index: true est sur un champ dans l'un de mes schémas et déclenche cet avertissement. Demandez-vous comment garantir une valeur unique sans recevoir cet avertissement.

@nonniv passe à la version 5.2.10 et définit mongoose.set('useCreateIndex', true);

Après la mise à niveau vers la version 5.2.10. L'une des options ci-dessous devrait arrêter les avertissements ?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
ou
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Cela n'a pas fonctionné ici. (Désolé si j'ai fait quelque chose de mal)

@samuelcecilio quels avertissements d'obsolescence spécifiques voyez-vous ? Il y a quelques notes utiles dans le commentaire qui a ouvert le # 6922, ou n'hésitez pas à partager vos avertissements spécifiques ici et je verrai si je peux vous aider.

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

@samuelcecilio le mongoose.set('useCreateIndex', true) devrait arrêter cet avertissement comme le montre cet exemple :

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

Sortir:

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

êtes-vous certain que votre projet utilise 5.2.10 ? y a-t-il d'autres packages dans votre projet utilisant d'autres versions de mongoose, etc.?

Salut, merci pour la réponse. Oui, j'ai vérifié la version trois fois lol :

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

Mon code

app.js
````js
...

const config = require('./config')
const mangouste = exiger ('mangouste')
const express = exiger('express')
const app = express()

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

....

module.exports = application
````

bin/www
````js

!/usr/bin/nœud env

const app = require('../app')
const config = require('../config')
const debug = require('debug')('blitz')
const http = nécessite('http')
const port = normalizePort(process.env.PORT || config.port)
const mangouste = exiger ('mangouste')

app.set('port', port)

serveur constant = http.createServer(app)

serveur.écoute(port)
serveur.on('error', onError)
serveur.on('listening', onListening)

const mongo = mangouste.connexion

mongo.on('error', error => { debug('mongo: ' + error.name) })
mongo.on('connecté', () => { debug('mongo: Connecté') })
mongo.on('déconnecté', () => { debug('mongo : déconnecté') })

....
````

Quand je cours DEBUG=blitz* npm run dev

````bash

nodemon bin/www

[nodémon] 1.18.3
[nodemon] pour redémarrer à tout moment, entrez rs
[nodemon] regarde : .
[nodemon] à partir node bin/www
blitz Ecoute sur le port 3000 +0ms
blitz mongo : Connecté +14ms
(node:10622) DeprecationWarning : collection.ensureIndex est obsolète. Utilisez plutôt createIndexes.
````

@samuelcecilio peut-être déplacer le mongoose.set('useCreateIndex', true) vers le fichier bin/www à la place ? Je vais configurer un exemple express et tester également.

@samuelcecilio après avoir joué avec cela, j'ai trouvé que je devais définir useCreateIndex sur true dans le fichier de route contenant le modèle. Dans mon cas, après avoir utilisé l'outil express cli, j'avais besoin de définir useCreateIndex dans la route d'index ci-dessous :

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;

sans l'option définie dans la route d'index, j'ai obtenu:

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

après avoir défini l'option dans l'itinéraire, j'ai obtenu:

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

J'ai essayé de le mettre dans bin/www mais cela n'a pas supprimé l'avertissement. Seul le réglage dans l'itinéraire a réussi.

sortie de curling localhost

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

J'utilise des fichiers séparés pour les utilisateurs, les clients, les fournisseurs, les commandes, les articles...

Cela a arrêté l'avertissement :

modèles/user.js
````js
const addressSchema = require('./address')
const profileSchema = require('./profile')
const uuidv4 = requiert('uuid/v4')
const mangouste = exiger ('mangouste')
const Schéma = mangouste.Schéma

mongoose.set('useCreateIndex', true)

const userSchema = nouveau schéma({
désactivé : { type : booléen, défaut : faux },
rôles : { type : tableau, valeur par défaut : [ 'assistant' ] },
identité : { type : chaîne, unique : vrai, obligatoire : vrai },
nom d'utilisateur : { type : chaîne, unique : vrai, obligatoire : vrai },
nom : { type : chaîne, majuscule : vrai, obligatoire : vrai },
mot de passe : { type : chaîne, requis : vrai },
secret : Chaîne,
profil : schéma de profil,
adresse : addressSchema,
créé : Date,
date modifiée
}, {
collection : 'utilisateurs'
})

userSchema.pre('enregistrer', fonction (suivant) {
const doc = ceci
doc.created = Date.maintenant()
doc.modifié = Date.maintenant()
doc.secret = uuidv4()
suivant()
})

module.exports = mongoose.model('Utilisateur', userSchema)

````

J'ai pensé que ce serait un paramètre global, mais apparemment, je dois ajouter tous les fichiers.

@samuelcecilio vous pouvez emballer la mangouste dans un fichier personnalisé, quelque chose comme

myMongoose.js

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

puis exigez votre emballage const mongoose = require('myMongoose') au lieu de mangouste partout. C'est probablement quelque chose comme ce que je finirai par devoir faire lorsque je commencerai à mettre à niveau au-delà de 5.2.8.

Encore faudrait-il que je modifie tous les fichiers actuels. Pour chaque fichier du dossier models , je remplacerais require ('mongoose') par require('myMongoose') . Il en va de même pour app.js et bin/www .

La question est : dans une future version de mongoose je n'aurai pas besoin d'inclure mongoose.set ('useCreateIndex', true) ou cela sera-t-il normal, pour des problèmes de compatibilité avec les anciennes versions de mongo, node, etc... ?

Je soupçonne que le comportement restera tel qu'il est maintenant ( avoir à définir la variable, pas son implémentation interne ) jusqu'à la prochaine version majeure (c'est-à-dire 6.0.0 ) de mangouste.

Pour l'instant, j'ai ajouté mongoose.set('useCreateIndex', true) à tous les fichiers contenant require('mongoose') . Je pense utiliser un wrapper ('./myMongoose') ou ('./mongoose-custom') . Qu'en penses-tu?

Cela devrait-il être global ? Est-ce un problème express ?

Il est vraiment inconfortable d'ajouter mongoose.set('useCreateIndex', true) dans chaque fichier contenant des déclarations de modèle.
Pourquoi ne pas le faire fonctionner également à partir des options connect , ou le définir avant la connexion ?

@samuelcecilio @bricss D'accord. Rouvrir ceci pour étudier les solutions potentielles.

Vous n'avez pas besoin de le mettre dans chaque fichier, mais malheureusement, il semble que vous deviez maintenant mettre mongoose.set('useCreateIndex', true) avant tout appel mongoose.model(). C'est délicat si vous exportez des modèles plutôt que des schémas. Ajoutera un correctif pour cela.

Après la mise à niveau vers la version 5.2.13, cela devrait-il arrêter les avertissements ? Merci

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 n'est pas une option de connexion, mais tant que vous appelez mongoose.set('useCreateIndex', true); avant d'appeler mongoose.model() (même dans d'autres fichiers), tous les appels ultérieurs à mongoose.model doivent se replier à l'option que vous avez définie avec mongoose.set() . J'ai testé 5.2.13 avec mon exemple ci-dessus, en appelant à la place mongoose.set('useCreateIndex', true) dans le fichier bin/www et non dans ma route. Ça fonctionne maintenant.

Cela fonctionne avec 5.2.13 après la connexion et avant tous les autres fichiers.

C'est la connexion dans mon fichier db.js :

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

J'ai ma connexion mongo dans un script séparé. De cette façon, j'appelle simplement mongoose.set('useCreateIndex', true); juste avant de se connecter à mongo. Ensuite, il n'est pas nécessaire de le mettre dans l'une de mes déclarations modèles.

La suggestion de @LucHighwalker est la bonne façon de procéder. Idéalement, vous placez toutes ces options globales juste avant votre appel à mongoose.connect() .

Existe-t-il une différence fonctionnelle entre

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

et

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

? Parce que les deux semblent fonctionner très bien dans 5.2.17

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

Fonctionne avec la dernière version

D'accord, je suppose que @types/mongoose a quelques versions en retard (ne fonctionne pas encore sur le tapuscrit).

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

La réponse de @Dionesio m'a fait l'affaire. Merci!

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

Cela a résolu tous mes avertissements de dépréciation.

@samuelcecilio après avoir joué avec cela, j'ai trouvé que je devais définir useCreateIndex sur true dans le fichier de route contenant le modèle. Dans mon cas, après avoir utilisé l'outil express cli, j'avais besoin de définir useCreateIndex dans la route d'index ci-dessous :

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;

sans l'option définie dans la route d'index, j'ai obtenu:

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

après avoir défini l'option dans l'itinéraire, j'ai obtenu:

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

J'ai essayé de le mettre dans bin/www mais cela n'a pas supprimé l'avertissement. Seul le réglage dans l'itinéraire a réussi.

sortie de curling localhost

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

Merci - Ajout de mongoose.set('useCreateIndex', true); a résolu mon problème

Je vais verrouiller ce problème. Pour référence future, consultez le guide des obsolescences sur nos documents

Cette page vous a été utile?
0 / 5 - 0 notes