Mongoose: DeprecationWarning: collection.ensureIndex está obsoleto. Em vez disso, use createIndexes.

Criado em 18 ago. 2018  ·  32Comentários  ·  Fonte: Automattic/mongoose

Após a atualização para a versão 5.2.9 estou recebendo esta mensagem no console o tempo todo, quando inicio meu aplicativo web:

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

E não uso nenhum dos dois.

enhancement

Comentários muito úteis

Após atualizar para a versão 5.2.10. Qualquer uma das opções abaixo deve interromper os avisos?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
ou
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Aqui não funcionou. (Desculpe se fiz algo errado)

Todos 32 comentários

duplicata de #6880

Obrigado por tomar o tempo para relatar o problema @bricss. Mongoose chama ensureIndex() internamente. Você pode ignorar o aviso com segurança por enquanto ou silenciá-lo com o sinalizador de nó --no-deprecation ou fazer downgrade para 5.2.8 se não houver correções específicas em 5.2.9 nas quais você estava confiando. Siga #6880 para atualizações 👍

,unique: true,index: true está em um campo em um dos meus esquemas e aciona este aviso. Questione como garantir um valor exclusivo sem receber esse aviso.

@nonniv atualize para 5.2.10 e defina mongoose.set('useCreateIndex', true);

Após atualizar para a versão 5.2.10. Qualquer uma das opções abaixo deve interromper os avisos?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
ou
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Aqui não funcionou. (Desculpe se fiz algo errado)

@samuelcecilio quais avisos de descontinuação específicos você está vendo? Há algumas notas úteis no comentário que abriu o nº 6922, ou sinta-se à vontade para compartilhar seus avisos específicos aqui e verei se posso ajudar.

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

@samuelcecilio o mongoose.set('useCreateIndex', true) deve parar esse aviso conforme demonstrado por este exemplo:

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

Saída:

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

você tem certeza de que seu projeto está usando 5.2.10? existem outros pacotes em seu projeto usando outras versões do mangusto, etc?

Olá, obrigado pela resposta. Sim, eu verifiquei a versão três vezes lol:

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

Meu código

app.js
```` js
...

const config = require('./config')
const mangusto = require('mangusto')
const express = require('express')
const app = express()

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

....

module.exports = app
````

bin/www
```` js

!/usr/bin/env nó

const app = require('../app')
const config = require('../config')
const debug = require('debug')('blitz')
const http = require('http')
const port = normalizePort(process.env.PORT || config.port)
const mangusto = require('mangusto')

app.set('porta', porta)

const server = http.createServer(app)

server.listen(porta)
server.on('erro', onError)
server.on('escutando', onListening)

const mongo = mangusto.conexão

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

....
````

Quando eu corro DEBUG=blitz* npm run dev

````bash

nodemon bin/www

[nodemon] 1.18.3
[nodemon] para reiniciar a qualquer momento, digite rs
[nodemon] assistindo: .
[nodemon] a partir node bin/www
blitz Ouvindo na porta 3000 +0ms
blitz mongo: Conectado +14ms
(nó:10622) DeprecationWarning: collection.ensureIndex está obsoleto. Em vez disso, use createIndexes.
````

@samuelcecilio talvez mova o mongoose.set('useCreateIndex', true) para o arquivo bin/www ? Vou configurar um exemplo expresso e testar também.

@samuelcecilio depois de brincar com isso, descobri que precisava definir useCreateIndex como true no arquivo de rota que continha o modelo. No meu caso, após usar a ferramenta express cli, precisei definir useCreateIndex na rota de índice mostrada abaixo:

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;

sem a opção definida na rota do índice, obtive:

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

depois de definir a opção na rota, obtive:

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

Eu tentei configurá-lo em bin/www, mas isso não se livrou do aviso. Apenas defini-lo na rota foi bem-sucedido.

saída de curling localhost

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

Eu uso arquivos separados para usuários, clientes, fornecedores, pedidos, itens..

Isso interrompeu o aviso:

models/user.js
```` js
const addressSchema = require('./address')
const profileSchema = require('./profile')
const uuidv4 = require('uuid/v4')
const mangusto = require('mangusto')
const Schema = mangusto.Schema

mongoose.set('useCreateIndex', true)

const userSchema = new Schema({
desativado: { tipo: booleano, padrão: falso },
roles: { type: Array, default: [ 'assistente' ] },
identity: { type: String, unique: true, obrigatório: true },
nome de usuário: { tipo: String, exclusivo: verdadeiro, obrigatório: verdadeiro },
nome: { tipo: String, maiúsculas: verdadeiro, obrigatório: verdadeiro },
senha: { tipo: String, obrigatório: true },
segredo: Corda,
perfil: profileSchema,
endereço: addressSchema,
Data de criação,
data modificada
}, {
coleção: 'usuários'
})

userSchema.pre('salvar', function (próximo) {
const doc = this
doc.created = Date.now()
doc.modified = Date.now()
doc.secret = uuidv4()
Next()
})

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

````

Achei que seria alguma configuração global, mas aparentemente tenho que adicionar todos os arquivos.

@samuelcecilio você poderia envolver o mangusto em um arquivo personalizado, algo como

meuMongoose.js

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

e, em seguida, exija seu wrapper const mongoose = require('myMongoose') em vez de mangusto em todos os lugares. Provavelmente é algo parecido com o que terei que fazer quando começar a atualizar para além do 5.2.8.

Ainda assim eu teria que modificar todos os arquivos atuais. Para cada arquivo na pasta models , eu substituiria require ('mongoose') por require('myMongoose') . O mesmo se aplica a app.js e bin/www .

A questão é: em uma versão futura de mongoose não precisarei incluir mongoose.set ('useCreateIndex', true) ou isso será normal, por problemas de compatibilidade com versões mais antigas do mongo, node, etc...?

Suspeito que o comportamento permanecerá como está agora ( tendo que definir a variável, não a implementação interna dela ) até a próxima versão principal (ou seja, 6.0.0 ) do mangusto.

Por enquanto, adicionei mongoose.set('useCreateIndex', true) a todos os arquivos que contêm require('mongoose') . Estou pensando em usar um wrapper ('./myMongoose') ou ('./mongoose-custom') . O que você acha?

Isso deveria ser global? É uma questão expressa?

É realmente desconfortável adicionar mongoose.set('useCreateIndex', true) em cada arquivo que contém declarações de modelo.
Por que não fazê-lo funcionar a partir das opções connect ou configurá-lo antes da conexão?

@samuelcecilio @bricss De acordo. Reabrindo isso para investigar possíveis soluções.

Você não precisa colocar isso em todos os arquivos, mas infelizmente parece que agora você precisa colocar mongoose.set('useCreateIndex', true) antes de qualquer chamada mongoose.model(). Isso é complicado se você exportar modelos em vez de esquemas. Irá adicionar uma correção para isso.

Após a atualização para a versão 5.2.13, isso deve interromper os avisos? Obrigado

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ão é uma opção de conexão, mas contanto que você chame mongoose.set('useCreateIndex', true); antes de chamar mongoose.model() (mesmo em outros arquivos), todas as chamadas subsequentes para mongoose.model devem retornar para a opção que você definiu com mongoose.set() . Eu testei 5.2.13 com meu exemplo acima, em vez disso chamando mongoose.set('useCreateIndex', true) no arquivo bin/www e não na minha rota. Funciona agora.

Funciona com 5.2.13 após a conexão e antes de todos os outros arquivos.

Esta é a conexão no meu arquivo db.js:

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

Eu tenho minha conexão mongo em um script separado. Desta forma eu chamo mongoose.set('useCreateIndex', true); logo antes de se conectar ao mongo. Então não há necessidade de colocá-lo em nenhuma das minhas declarações de modelo.

A sugestão de @LucHighwalker é a maneira certa de fazer isso. Idealmente, você coloca todas essas opções globais logo antes de sua chamada para mongoose.connect() .

Existe alguma diferença funcional entre

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

e

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

? Porque ambos parecem funcionar bem em 5.2.17

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

Funciona com a versão mais recente

Ok, eu acho que @types/mongoose é algumas versões anteriores (ainda não funciona no texto datilografado).

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

A resposta de @Dionesio fez o truque para mim. Obrigado!

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

Isso resolveu todos os meus avisos de depreciação.

@samuelcecilio depois de brincar com isso, descobri que precisava definir useCreateIndex como true no arquivo de rota que continha o modelo. No meu caso, após usar a ferramenta express cli, precisei definir useCreateIndex na rota de índice mostrada abaixo:

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;

sem a opção definida na rota do índice, obtive:

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

depois de definir a opção na rota, obtive:

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

Eu tentei configurá-lo em bin/www, mas isso não se livrou do aviso. Apenas defini-lo na rota foi bem-sucedido.

saída de curling localhost

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

Obrigado - Adicionando mongoose.set('useCreateIndex', true); corrigiu meu problema

Vou travar este assunto. Para referência futura, consulte o guia de descontinuações em nossos documentos

Esta página foi útil?
0 / 5 - 0 avaliações