Mongoose: DeprecationWarning: collection.ensureIndex tidak digunakan lagi. Gunakan createIndexes sebagai gantinya.

Dibuat pada 18 Agu 2018  ·  32Komentar  ·  Sumber: Automattic/mongoose

Setelah memperbarui ke versi 5.2.9 Saya mendapatkan pesan ini di konsol sepanjang waktu, ketika saya memulai aplikasi web saya:

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

Dan saya tidak menggunakan keduanya.

enhancement

Komentar yang paling membantu

Setelah memutakhirkan ke versi 5.2.10. Salah satu opsi di bawah ini harus menghentikan peringatan?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
atau
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Itu tidak berhasil di sini. (Maaf jika saya melakukan sesuatu yang salah)

Semua 32 komentar

duplikat #6880

Terima kasih telah meluangkan waktu untuk melaporkan masalah ini @bricss. Luwak memanggil ensureIndex() secara internal. Anda dapat dengan aman mengabaikan peringatan untuk saat ini, atau membungkamnya dengan flag node --no-deprecation , atau menurunkan versi ke 5.2.8 jika tidak ada perbaikan khusus di 5.2.9 yang Anda andalkan. Ikuti #6880 untuk pembaruan 👍

,unique: true,index: true ada di satu bidang di salah satu skema saya dan itu memicu peringatan ini. Pertanyaan bagaimana memastikan nilai unik tanpa mendapatkan peringatan ini.

@nonniv tingkatkan ke 5.2.10 dan setel mongoose.set('useCreateIndex', true);

Setelah memutakhirkan ke versi 5.2.10. Salah satu opsi di bawah ini harus menghentikan peringatan?

js mongoose.connect(config.dbUri, { useCreateIndex: true, useNewUrlParser: true })
atau
js mongoose.set('useCreateIndex', true) mongoose.connect(config.dbUri, { useNewUrlParser: true })
Itu tidak berhasil di sini. (Maaf jika saya melakukan sesuatu yang salah)

@samuelcecilio peringatan penghentian spesifik apa yang Anda lihat? Ada beberapa catatan bermanfaat dalam komentar yang membuka #6922, atau jangan ragu untuk membagikan peringatan spesifik Anda di sini dan saya akan melihat apakah saya dapat membantu.

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

@samuelcecilio mongoose.set('useCreateIndex', true) harus menghentikan peringatan itu seperti yang ditunjukkan oleh contoh ini:

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

Keluaran:

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

apakah Anda yakin bahwa proyek Anda menggunakan 5.2.10? apakah ada paket lain di proyek Anda yang menggunakan versi luwak lain, dll?

Hai, terima kasih atas jawabannya. Ya, saya memeriksa versi tiga kali lol:

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

kode saya

app.js
````js
...

const config = memerlukan('./config')
const luwak = membutuhkan('luwak')
const ekspres = membutuhkan('ekspres')
aplikasi const = ekspres()

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

....

module.exports = aplikasi
````

tempat sampah/www
````js

!/usr/bin/env simpul

const aplikasi = memerlukan('../aplikasi')
const config = memerlukan('../config')
const debug = membutuhkan('debug')('blitz')
const http = membutuhkan('http')
const port = normalizePort(process.env.PORT || config.port)
const luwak = membutuhkan('luwak')

app.set('port', port)

const server = http.createServer(aplikasi)

server.listen(port)
server.on('kesalahan', onError)
server.on('mendengarkan', onListening)

const mongo = luwak.koneksi

mongo.on('error', error => { debug('mongo: ' + error.name) })
mongo.on('terhubung', () => { debug('mongo: Terhubung') })
mongo.on('terputus', () => { debug('mongo: Terputus') })

....
````

Ketika saya menjalankan DEBUG=blitz* npm run dev

```` bash

nodemon bin/www

[simpul] 1.18.3
[nodemon] untuk memulai kembali kapan saja, masukkan rs
[nodemon] menonton: .
[nodemon] mulai node bin/www
blitz Mendengarkan pada port 3000 +0ms
blitz mongo: Terhubung +14 md
(node:10622) DeprecationWarning: collection.ensureIndex tidak digunakan lagi. Gunakan createIndexes sebagai gantinya.
````

@samuelcecilio mungkin memindahkan mongoose.set('useCreateIndex', true) ke file bin/www saja? Saya akan menyiapkan contoh ekspres dan menguji juga.

@samuelcecilio setelah bermain-main dengan beberapa ini, saya menemukan bahwa saya perlu mengatur useCreateIndex menjadi true dalam file rute yang berisi model. Dalam kasus saya, setelah menggunakan alat cli ekspres, saya perlu mengatur useCreateIndex di rute indeks yang ditunjukkan di bawah ini:

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;

tanpa opsi yang disetel dalam rute indeks yang saya dapatkan:

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

setelah mengatur opsi di rute yang saya dapatkan:

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

Saya mencoba mengaturnya di bin/www tetapi itu tidak menghilangkan peringatan. Hanya pengaturannya di rute yang berhasil.

keluaran curling localhost

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

Saya menggunakan file terpisah untuk pengguna, pelanggan, pemasok, pesanan, item..

Ini menghentikan peringatan:

model/pengguna.js
````js
const addressSchema = membutuhkan('./alamat')
const profileSchema = membutuhkan('./profil')
const uuidv4 = membutuhkan('uuid/v4')
const luwak = membutuhkan('luwak')
const Skema = luwak.Skema

luwak.set('useCreateIndex', benar)

const userSchema = Skema baru({
dinonaktifkan: { jenis: Boolean, default: false },
peran: { type: Array, default: [ 'asisten' ] },
identitas: { jenis: String, unik: benar, diperlukan: benar },
nama pengguna: { ketik: String, unik: benar, diperlukan: benar },
nama: { ketik: String, huruf besar: benar, diperlukan: benar },
kata sandi: { ketik: String, diperlukan: benar },
rahasia: Tali,
profil: profilSkema,
alamat: alamatSkema,
dibuat: Tanggal,
tanggal yang diubah
}, {
koleksi: 'pengguna'
})

userSchema.pre('simpan', fungsi (berikutnya) {
const doc = ini
doc.created = Tanggal.sekarang()
doc.modified = Tanggal.sekarang()
doc.secret = uuidv4()
Selanjutnya()
})

module.exports = luwak.model('Pengguna', skema pengguna)

````

Saya pikir itu akan menjadi beberapa pengaturan global, tetapi ternyata saya harus menambahkan semua file.

@samuelcecilio Anda bisa membungkus luwak dalam file khusus, seperti

myMongoose.js

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

dan kemudian minta pembungkus Anda const mongoose = require('myMongoose') alih-alih luwak di mana-mana. Itu mungkin sesuatu seperti apa yang akhirnya harus saya lakukan ketika saya mulai memutakhirkan di luar 5.2.8.

Tetap saja saya harus memodifikasi semua file saat ini. Untuk setiap file di folder models , saya akan mengganti require ('mongoose') dengan require('myMongoose') . Hal yang sama akan berlaku untuk app.js dan bin/www .

Pertanyaannya adalah: dalam versi mongoose yang akan datang saya tidak perlu memasukkan mongoose.set ('useCreateIndex', true) atau apakah ini normal, untuk masalah kompatibilitas dengan versi mongo, node, dll yang lebih lama ...?

Saya menduga perilaku akan tetap seperti sekarang ( harus mengatur variabel, bukan implementasi internalnya ) hingga versi utama berikutnya (yaitu 6.0.0 ) dari luwak.

Untuk saat ini, saya telah menambahkan mongoose.set('useCreateIndex', true) ke semua file yang berisi require('mongoose') . Saya sedang berpikir untuk menggunakan pembungkus ('./myMongoose') atau ('./mongoose-custom') . Bagaimana menurut anda?

Haruskah ini mendunia? Apakah ini masalah ekspres?

Sangat tidak nyaman untuk menambahkan mongoose.set('useCreateIndex', true) di setiap file yang berisi deklarasi model.
Mengapa tidak membuatnya bekerja dari opsi connect juga, atau mengaturnya sebelum koneksi?

@samuelcecilio @bricss Setuju. Membuka kembali ini untuk menyelidiki solusi potensial.

Anda tidak perlu meletakkan ini di setiap file, tetapi sayangnya sepertinya saat ini Anda perlu meletakkan mongoose.set('useCreateIndex', true) sebelum panggilan mongoose.model(). Itu rumit jika Anda mengekspor model sebagai lawan skema. Akan menambahkan perbaikan untuk ini.

Setelah memutakhirkan ke versi 5.2.13, haruskah ini menghentikan peringatan? Terima kasih

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 bukan opsi koneksi, tetapi selama Anda memanggil mongoose.set('useCreateIndex', true); sebelum memanggil mongoose.model() ( bahkan di file lain ) semua panggilan berikutnya ke luwak.model harus mundur ke opsi yang Anda atur dengan mongoose.set() . Saya menguji 5.2.13 dengan contoh saya di atas, alih-alih memanggil mongoose.set('useCreateIndex', true) di file bin/www dan bukan di rute saya. Ini bekerja sekarang.

Ia bekerja dengan 5.2.13 setelah koneksi dan sebelum semua file lainnya.

Ini adalah koneksi di file db.js saya:

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

Saya memiliki koneksi mongo saya dalam skrip terpisah. Dengan cara ini saya hanya memanggil luwak.set('useCreateIndex', true); tepat sebelum benar-benar terhubung ke mongo. Maka tidak perlu memasukkannya ke dalam deklarasi model saya.

Saran @LucHighwalker adalah cara yang tepat untuk melakukan ini. Idealnya Anda meletakkan semua opsi global ini tepat sebelum panggilan Anda ke mongoose.connect() .

Apakah ada perbedaan fungsional antara

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

dan

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

? Karena keduanya tampaknya berfungsi dengan baik di 5.2.17

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

Bekerja dengan versi terbaru

Oke, saya kira @types/luwak adalah beberapa versi di belakang itu (belum berfungsi pada TypeScript).

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

Jawaban @Dionesio berhasil bagi saya. Terima kasih!

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

Ini menyelesaikan semua peringatan penghentian saya.

@samuelcecilio setelah bermain-main dengan beberapa ini, saya menemukan bahwa saya perlu mengatur useCreateIndex menjadi true dalam file rute yang berisi model. Dalam kasus saya, setelah menggunakan alat cli ekspres, saya perlu mengatur useCreateIndex di rute indeks yang ditunjukkan di bawah ini:

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;

tanpa opsi yang disetel dalam rute indeks yang saya dapatkan:

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

setelah mengatur opsi di rute yang saya dapatkan:

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

Saya mencoba mengaturnya di bin/www tetapi itu tidak menghilangkan peringatan. Hanya pengaturannya di rute yang berhasil.

keluaran curling localhost

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

Terima kasih - Menambahkan mongoose.set('useCreateIndex', true); memperbaiki masalah saya

Saya akan mengunci masalah ini. Untuk referensi di masa mendatang, lihat panduan penghentian di dokumen kami

Apakah halaman ini membantu?
0 / 5 - 0 peringkat