Mongoose: DeprecationWarning: collection.ensureIndex está en desuso. Utilice createIndexes en su lugar.

Creado en 18 ago. 2018  ·  32Comentarios  ·  Fuente: Automattic/mongoose

Después de actualizar a la versión 5.2.9 Recibo este mensaje en la consola todo el tiempo, cuando inicio mi aplicación web:

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

Y no uso ninguno de los dos.

enhancement

Comentario más útil

Después de actualizar a la versión 5.2.10. ¿Alguna de las siguientes opciones debería detener las advertencias?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
o
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Aquí no funcionó. (Perdón si hice algo mal)

Todos 32 comentarios

duplicado de #6880

Gracias por tomarse el tiempo para informar el problema @bricss. Mongoose llama a ensureIndex() internamente. Puede ignorar la advertencia de forma segura por ahora, o silenciarla con el indicador de nodo --no-deprecation , o cambiar a 5.2.8 si no hay correcciones específicas en 5.2.9 en las que confiaba. Sigue #6880 para actualizaciones 👍

,unique: true,index: true está en un campo en uno de mis esquemas y activa esta advertencia. Pregunta cómo garantizar un valor único sin recibir esta advertencia.

@nonniv actualice a 5.2.10 y establezca mongoose.set('useCreateIndex', true);

Después de actualizar a la versión 5.2.10. ¿Alguna de las siguientes opciones debería detener las advertencias?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
o
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Aquí no funcionó. (Perdón si hice algo mal)

@samuelcecilio, ¿qué advertencias de desaprobación específicas ve? Hay algunas notas útiles en el comentario que abrió #6922, o siéntase libre de compartir sus advertencias específicas aquí y veré si puedo ayudar.

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

@samuelcecilio el mongoose.set('useCreateIndex', true) debería detener esa advertencia como lo demuestra este ejemplo:

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

Producción:

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

¿Estás seguro de que tu proyecto está usando 5.2.10? ¿Hay otros paquetes en su proyecto que usen otras versiones de mongoose, etc.?

Hola, gracias por la respuesta. Sí, revisé la versión tres veces jajaja:

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

Mi código

aplicación.js
````js
...

const config = require('./config')
const mangosta = require('mangosta')
const expreso = require('expreso')
const aplicación = express()

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

....

módulo.exportaciones = aplicación
````

papelera/www
````js

!/usr/bin/env nodo

const aplicación = require('../aplicación')
const config = require('../config')
const debug = require('debug')('blitz')
constante http = require('http')
const port = normalizePort(process.env.PORT || config.port)
const mangosta = require('mangosta')

app.set('puerto', puerto)

servidor const = http.createServer (aplicación)

servidor.escucha(puerto)
servidor.on('error', onError)
server.on('escuchando', onEscuchando)

const mongo = mangosta.conexión

mongo.on('error', error => { debug('mongo: ' + error.nombre) })
mongo.on('conectado', () => { debug('mongo: Conectado') })
mongo.on('desconectado', () => { debug('mongo: Desconectado') })

....
````

Cuando ejecuto DEBUG=blitz* npm run dev

````golpe

nodemon bin/www

[nodemonio] 1.18.3
[nodemon] para reiniciar en cualquier momento, ingrese rs
[nodemon] viendo: .
[nodemonio] a partir node bin/www
blitz Escuchando en el puerto 3000 +0ms
blitz mongo: Conectado +14ms
(nodo: 10622) DeprecationWarning: collection.ensureIndex está en desuso. Utilice createIndexes en su lugar.
````

@samuelcecilio quizás mueva el mongoose.set('useCreateIndex', true) al archivo bin/www en su lugar. Configuraré un ejemplo expreso y probaré también.

@samuelcecilio después de jugar un poco con esto, descubrí que necesitaba establecer useCreateIndex en verdadero en el archivo de ruta que contenía el modelo. En mi caso, después de usar la herramienta express cli, necesitaba configurar useCreateIndex en la ruta de índice que se muestra a continuación:

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;

sin la opción establecida en la ruta de índice obtuve:

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

después de configurar la opción en la ruta obtuve:

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

Intenté configurarlo en bin/www pero eso no eliminó la advertencia. Solo configurarlo en la ruta fue exitoso.

salida de curling localhost

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

Utilizo archivos separados para usuarios, clientes, proveedores, pedidos, artículos...

Esto detuvo la advertencia:

modelos/usuario.js
````js
const esquemaDirección = require('./dirección')
const perfilEsquema = require('./perfil')
const uuidv4 = require('uuid/v4')
const mangosta = require('mangosta')
const Schema = mangosta.Schema

mangosta.set('useCreateIndex', verdadero)

const userSchema = nuevo esquema ({
deshabilitado: {tipo: booleano, predeterminado: falso},
roles: { tipo: Matriz, predeterminado: [ 'asistente'] },
identidad: {tipo: Cadena, único: verdadero, requerido: verdadero},
nombre de usuario: {tipo: Cadena, único: verdadero, requerido: verdadero},
nombre: {tipo: cadena, mayúsculas: verdadero, requerido: verdadero},
contraseña: {tipo: cadena, requerido: verdadero},
secreto: cadena,
perfil: esquema de perfil,
dirección: direcciónEsquema,
Fecha de creación,
modificado: Fecha
}, {
colección: 'usuarios'
})

userSchema.pre('guardar', función (siguiente) {
const doc = esto
doc.creado = Fecha.ahora()
doc.modificado = Fecha.ahora()
doc.secreto = uuidv4()
Siguiente()
})

módulo.exportaciones = mangosta.modelo('Usuario', esquemaUsuario)

````

Pensé que sería una configuración global, pero aparentemente tengo que agregar todos los archivos.

@samuelcecilio podría envolver mangosta en un archivo personalizado, algo así como

myMongoose.js

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

y luego solicite su envoltorio const mongoose = require('myMongoose') en lugar de mangosta en todas partes. Probablemente sea algo así como lo que tendré que hacer cuando comience a actualizar más allá de 5.2.8.

Aún así tendría que modificar todos los archivos actuales. Para cada archivo en la carpeta models , reemplazaría require ('mongoose') con require('myMongoose') . Lo mismo se aplicaría a app.js y bin/www .

La pregunta es: en una futura versión de mongoose no necesitaré incluir mongoose.set ('useCreateIndex', true) o será esto normal, por problemas de compatibilidad con versiones anteriores de mongo, node, etc...?

Sospecho que el comportamiento permanecerá como está ahora ( tener que configurar la variable, no la implementación interna de la misma ) hasta la próxima versión principal (es decir , 6.0.0 ) de mongoose.

Por ahora, he agregado mongoose.set('useCreateIndex', true) a todos los archivos que contienen require('mongoose') . Estoy pensando en usar un envoltorio ('./myMongoose') o ('./mongoose-custom') . ¿Qué piensas?

¿Debería ser esto mundial? es un tema express?

Es realmente incómodo agregar mongoose.set('useCreateIndex', true) en cada archivo que contiene declaraciones de modelos.
¿Por qué no se hace que funcione también desde las opciones connect , o se configura antes de la conexión?

@samuelcecilio @bricss De acuerdo. Reapertura de esto para investigar posibles soluciones.

No necesita poner esto en cada archivo, pero desafortunadamente parece que en este momento necesita poner mongoose.set('useCreateIndex', true) antes de cualquier llamada mongoose.model(). Eso es complicado si exporta modelos en lugar de esquemas. Agregará una solución para esto.

Después de actualizar a la versión 5.2.13, ¿debería detener las advertencias? Gracias

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 no es una opción de conexión, pero siempre que llame a mongoose.set('useCreateIndex', true); antes de llamar a mongoose.model() (incluso en otros archivos), todas las llamadas posteriores a mongoose.model deberían retroceder a la opción que configuró con mongoose.set() . Probé 5.2.13 con mi ejemplo anterior, en lugar de llamar a mongoose.set('useCreateIndex', true) en el archivo bin/www y no en mi ruta. Ahora funciona.

Funciona con 5.2.13 después de la conexión y antes de todos los demás archivos.

Esta es la conexión en mi archivo db.js:

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

Tengo mi conexión mongo en un script separado. De esta manera simplemente llamo mongoose.set('useCreateIndex', true); justo antes de conectarse a mongo. Entonces no hay necesidad de ponerlo en ninguna de mis declaraciones de modelo.

La sugerencia de @LucHighwalker es la forma correcta de hacer esto. Lo ideal es poner todas estas opciones globales justo antes de su llamada a mongoose.connect() .

¿Hay alguna diferencia funcional entre

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

y

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

? Porque ambos parecen funcionar bien en 5.2.17

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

Funciona con la última versión.

De acuerdo, supongo que @types/mongoose está algunas versiones atrasadas (aún no funciona en mecanografiado).

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

La respuesta de @Dionesio me funcionó. ¡Gracias!

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

Esto resolvió todas mis advertencias de desaprobación.

@samuelcecilio después de jugar un poco con esto, descubrí que necesitaba establecer useCreateIndex en verdadero en el archivo de ruta que contenía el modelo. En mi caso, después de usar la herramienta express cli, necesitaba configurar useCreateIndex en la ruta de índice que se muestra a continuación:

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;

sin la opción establecida en la ruta de índice obtuve:

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

después de configurar la opción en la ruta obtuve:

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

Intenté configurarlo en bin/www pero eso no eliminó la advertencia. Solo configurarlo en la ruta fue exitoso.

salida de curling localhost

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

Gracias - Agregando mongoose.set('useCreateIndex', true); arreglé mi problema

Voy a bloquear este problema. Para referencia futura, consulte la guía de obsolescencia en nuestros documentos

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

weisjohn picture weisjohn  ·  3Comentarios

efkan picture efkan  ·  3Comentarios

CodeurSauvage picture CodeurSauvage  ·  3Comentarios

Igorpollo picture Igorpollo  ·  3Comentarios

adamreisnz picture adamreisnz  ·  3Comentarios