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.
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:
#!/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:
¿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
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.
~>: 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
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
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)