Mongoose: DeprecationWarning: collection.ensureIndex ist veraltet. Verwenden Sie stattdessen createIndexes.

Erstellt am 18. Aug. 2018  ·  32Kommentare  ·  Quelle: Automattic/mongoose

Nach dem Update auf Version 5.2.9 bekomme ich in der Konsole ständig diese Meldung, wenn ich meine Web-App starte:

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

Und ich benutze keine von beiden.

enhancement

Hilfreichster Kommentar

Nach dem Upgrade auf Version 5.2.10. Eine der folgenden Optionen sollte die Warnungen stoppen?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
oder
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Hier hat es nicht funktioniert. (Entschuldigung, wenn ich etwas falsch gemacht habe)

Alle 32 Kommentare

Duplikat von #6880

Vielen Dank, dass Sie sich die Zeit genommen haben, das Problem @bricss zu melden. Mongoose ruft intern ensureIndex() an. Sie können die Warnung vorerst ignorieren oder sie mit dem Node-Flag --no-deprecation stumm schalten oder auf 5.2.8 herunterstufen, wenn es keine spezifischen Fixes in 5.2.9 gibt, auf die Sie sich verlassen haben. Folge #6880 für Updates 👍

,unique: true,index: true befindet sich in einem meiner Schemas in einem Feld und löst diese Warnung aus. Fragen Sie, wie Sie einen eindeutigen Wert sicherstellen können, ohne diese Warnung zu erhalten.

@nonniv upgrade auf 5.2.10 und setze mongoose.set('useCreateIndex', true);

Nach dem Upgrade auf Version 5.2.10. Eine der folgenden Optionen sollte die Warnungen stoppen?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
oder
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Hier hat es nicht funktioniert. (Entschuldigung, wenn ich etwas falsch gemacht habe)

@samuelcecilio welche spezifischen Abwertungswarnungen sehen Sie? Es gibt einige hilfreiche Hinweise in dem Kommentar, der #6922 geöffnet hat, oder teilen Sie Ihre spezifischen Warnungen hier mit und ich werde sehen, ob ich helfen kann.

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

@samuelcecilio der mongoose.set('useCreateIndex', true) sollte diese Warnung stoppen, wie dieses Beispiel zeigt:

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

Ausgabe:

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

Sind Sie sicher, dass Ihr Projekt 5.2.10 verwendet? Gibt es andere Pakete in Ihrem Projekt, die andere Versionen von Mongoose usw. verwenden?

Hallo, danke für die Antwort. Ja, ich habe die Version dreimal überprüft lol:

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

Mein Code

app.js
````js
...

const config = require('./config')
const Mungo = require('Mungo')
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-Knoten

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 Mungo = require('Mungo')

app.set('Port', Port)

konstanter Server = http.createServer(app)

server.listen(port)
server.on('Fehler', onError)
server.on('hören', onListening)

const mongo = mongoose.connection

mongo.on('error', error => { debug('mongo: ' + error.name) })
mongo.on('verbunden', () => { debug('mongo: Verbunden') })
mongo.on('disconnected', () => { debug('mongo: Disconnected') })

....
````

Wenn ich DEBUG=blitz* npm run dev laufen lasse

```` bash

nodemon bin/www

[Knoten] 1.18.3
[nodemon] Um jederzeit neu zu starten, geben Sie rs ein
[nodemon] beobachtet: .
[nodemon] ab node bin/www
blitz Hören auf Port 3000 +0ms
Blitz Mongo: Verbunden +14ms
(node:10622) DeprecationWarning: collection.ensureIndex ist veraltet. Verwenden Sie stattdessen createIndexes.
````

@samuelcecilio vielleicht stattdessen die Datei mongoose.set('useCreateIndex', true) in die Datei bin/www verschieben? Ich werde ein Express-Beispiel einrichten und auch testen.

@samuelcecilio Nachdem ich damit herumgespielt hatte, stellte ich fest, dass ich useCreateIndex in der Routendatei, die das Modell enthielt, auf true setzen musste. In meinem Fall musste ich nach der Verwendung des Express-Cli-Tools useCreateIndex in der unten gezeigten Indexroute festlegen:

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;

Ohne die in der Indexroute festgelegte Option habe ich Folgendes erhalten:

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

Nachdem ich die Option in der Route eingestellt hatte, bekam ich:

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

Ich habe versucht, es in bin/www einzustellen, aber das hat die Warnung nicht beseitigt. Nur das Setzen in der Route war erfolgreich.

Ausgabe von curling localhost

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

Ich verwende separate Dateien für Benutzer, Kunden, Lieferanten, Bestellungen, Artikel..

Dies stoppte die Warnung:

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

mongoose.set('useCreateIndex', true)

const userSchema = neues Schema({
deaktiviert: { Typ: Boolean, Standard: falsch },
Rollen: { Typ: Array, Standard: [ 'Assistent' ] },
Identität: { Typ: Zeichenfolge, eindeutig: wahr, erforderlich: wahr },
Benutzername: { Typ: String, eindeutig: wahr, erforderlich: wahr },
Name: { Typ: String, Großbuchstaben: wahr, erforderlich: wahr },
Passwort: { Typ: String, erforderlich: wahr },
Geheimnis: Schnur,
Profil: Profilschema,
Adresse: Adressschema,
erstellt: Datum,
geändert: Datum
}, {
Sammlung: 'Benutzer'
})

userSchema.pre('save', function (next) {
const doc = das
doc.created = Datum.now()
doc.modified = Datum.now()
doc.secret = uuidv4()
nächste()
})

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

````

Ich dachte, es wäre eine globale Einstellung, aber anscheinend muss ich alle Dateien hinzufügen.

@samuelcecilio Sie könnten Mungo in eine benutzerdefinierte Datei packen, so etwas wie

myMongoose.js

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

und dann verlangen Sie überall Ihren Wrapper const mongoose = require('myMongoose') anstelle von Mungo. Das ist wahrscheinlich so etwas wie das, was ich am Ende tun muss, wenn ich mit dem Upgrade über 5.2.8 hinaus beginne.

Trotzdem müsste ich alle aktuellen Dateien modifizieren. Für jede Datei im Ordner models würde ich require ('mongoose') durch require('myMongoose') ersetzen. Dasselbe würde für app.js und bin/www gelten.

Die Frage ist: In einer zukünftigen Version von mongoose werde ich mongoose.set ('useCreateIndex', true) nicht mehr einfügen müssen oder wird dies normal sein, wegen Kompatibilitätsproblemen mit älteren Versionen von Mongo, Node usw.?

Ich vermute, dass das Verhalten bis zur nächsten Hauptversion (dh 6.0.0 ) von Mongoose so bleiben wird, wie es jetzt ist ( die Variable muss gesetzt werden, nicht die interne Implementierung davon ).

Im Moment habe ich allen Dateien, die require('mongoose') mongoose.set('useCreateIndex', true) hinzugefügt. Ich denke an die Verwendung eines Wrappers ('./myMongoose') oder ('./mongoose-custom') . Was denkst du?

Soll das global sein? Ist es ein Express-Problem?

Es ist wirklich unbequem, mongoose.set('useCreateIndex', true) in jede einzelne Datei einzufügen, die Modelldeklarationen enthält.
Warum funktioniert es nicht auch mit den connect Optionen oder stellt es vor der Verbindung ein?

@samuelcecilio @bricss Einverstanden. Öffnen Sie dies erneut, um mögliche Lösungen zu untersuchen.

Sie müssen dies nicht in jede Datei einfügen, aber leider sieht es im Moment so aus, als müssten Sie mongoose.set('useCreateIndex', true) vor allen Aufrufen von mongoose.model() einfügen. Das ist schwierig, wenn Sie Modelle statt Schemas exportieren. Wird eine Lösung dafür hinzufügen.

Sollte dies nach dem Upgrade auf Version 5.2.13 die Warnungen stoppen? Danke

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 ist keine Verbindungsoption, aber solange Sie mongoose.set('useCreateIndex', true); aufrufen, bevor Sie mongoose.model() aufrufen (sogar in anderen Dateien), sollten alle nachfolgenden Aufrufe von mongoose.model zurückfallen zu der Option, die Sie mit mongoose.set() eingestellt haben. Ich habe 5.2.13 mit meinem obigen Beispiel getestet und stattdessen mongoose.set('useCreateIndex', true) in der bin/www-Datei und nicht in meiner Route aufgerufen. Es funktioniert jetzt.

Es funktioniert mit 5.2.13 nach der Verbindung und vor allen anderen Dateien.

Dies ist eine Verbindung in meiner db.js-Datei:

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

Ich habe meine Mongo-Verbindung in einem separaten Skript. Auf diese Weise rufe ich einfach mongoose.set('useCreateIndex', true); kurz vor der eigentlichen Verbindung mit Mongo. Dann besteht keine Notwendigkeit, es in eine meiner Mustererklärungen aufzunehmen.

Der Vorschlag von @LucHighwalker ist der richtige Weg, dies zu tun. Idealerweise platzieren Sie all diese globalen Optionen direkt vor Ihrem Aufruf von mongoose.connect() .

Gibt es einen funktionellen Unterschied zwischen

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

und

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

? Denn beide scheinen in 5.2.17 einwandfrei zu funktionieren

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

Funktioniert mit der neusten Version

Okay, ich denke, @types/mongoose ist einige Versionen hinterher (funktioniert noch nicht mit Typoskript).

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

Die Antwort von @Dionesio hat mich überzeugt. Danke!

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

Dies löste alle meine Abwertungswarnungen.

@samuelcecilio Nachdem ich damit herumgespielt hatte, stellte ich fest, dass ich useCreateIndex in der Routendatei, die das Modell enthielt, auf true setzen musste. In meinem Fall musste ich nach der Verwendung des Express-Cli-Tools useCreateIndex in der unten gezeigten Indexroute festlegen:

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;

Ohne die in der Indexroute festgelegte Option habe ich Folgendes erhalten:

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

Nachdem ich die Option in der Route eingestellt hatte, bekam ich:

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

Ich habe versucht, es in bin/www einzustellen, aber das hat die Warnung nicht beseitigt. Nur das Setzen in der Route war erfolgreich.

Ausgabe von curling localhost

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

Danke - Hinzufügen von mongoose.set('useCreateIndex', true); mein Problem behoben

Ich werde dieses Problem sperren. Weitere Informationen finden Sie im Leitfaden zu veralteten Inhalten in unserer Dokumentation

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen