Mongoose: DeprecationWarning: `open()` tidak digunakan lagi di luwak >= 4.11.0, gunakan `openUri()` sebagai gantinya

Dibuat pada 25 Jun 2017  ·  158Komentar  ·  Sumber: Automattic/mongoose

DeprecationWarning: open() tidak digunakan lagi di luwak >= 4.11.0, gunakan openUri() sebagai gantinya, atau setel opsi useMongoClient jika menggunakan connect() atau createConnection()

Mongoose 4.11.0, MongoDB 2.2.29, NodeJS 8.1.2

Komentar yang paling membantu

Perbaikan termudah untuk ini; " npm remove mongoose " lalu " npm install [email protected] --save " masalah terpecahkan. Upgrade tidak selalu merupakan pilihan terbaik.

Semua 158 komentar

+1 , saya tidak tahu harus memperbaiki di mana untuk menghilangkan peringatan itu

Peringatan itu sebenarnya untuk kode di dalam Mongoose, saat menghubungkan string memiliki set replika:

Mongoose.prototype.connect = function() {
  var conn = this.connection;
  if ((arguments.length === 2 || arguments.length === 3) &&
      typeof arguments[0] === 'string' &&
      typeof arguments[1] === 'object' &&
      arguments[1].useMongoClient === true) {
    return conn.openUri(arguments[0], arguments[1], arguments[2]);
  }
  if (rgxReplSet.test(arguments[0]) || checkReplicaSetInUri(arguments[0])) {
    return new MongooseThenable(this, conn.openSet.apply(conn, arguments));
  }

  return new MongooseThenable(this, conn.open.apply(conn, arguments));
};

@tinovyatkin

Jadi, ini bug?

sepertinya bug, dapatkah kami mengatasinya dengan menambahkan useMongoClient: true ke opsi (Anda mungkin melihat penghentian dari driver MongoDB tetapi itu tidak membuang)

Menambahkan useMongoClient: true akan membuat pesan tersebut hilang, tetapi kemudian dokumen saya berhenti memuat. Belum men-debugnya lebih dalam, tetapi saya lebih suka mendengar praktik terbaik terlebih dahulu sebelum saya mengadaptasi kode saya.

Aplikasi saya juga tidak berfungsi dengan solusi yang disarankan di atas. Itu hanya tidak menjalankan metode MyModel.find lagi dan tidak memberikan kesalahan dan tidak ada batas waktu.

Alasan mengapa opsi "useMongoclient: true" tidak berfungsi untuk sebagian besar kasus adalah karena opsi itu, setiap objek terkait koneksi luwak mengembalikan objek dummy karena tidak dapat mengakses mongodb

Saya mencoba menggunakannya seperti

const server = express();
mongoose.connect('mongodb://localhost/advisorDemoTestDB', { useMongoClient: true })
    .then(() => require('./db-init')(server))
    .catch(err => console.error(err));

tapi tidak berhasil

Memiliki masalah yang sama, bahkan tanpa set replika.

Memiliki masalah yang sama:

(node:4138) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0,
 use `openUri()` instead, or set the `useMongoClient` option if using `connect()` 
or `createConnection()`

Sama...

Setelah saya menambahkan kode di bawah ini ke koneksi mongo saya, saya tidak dapat menanyakan apa pun sekarang.
{useMongoClient: benar}.
Setiap saran akan dihargai!!

+1 sama dengan set replika, tanpa pecahan

+1

+1

+1

+1

+1

+1

+1

Perbaikan termudah untuk ini; " npm remove mongoose " lalu " npm install [email protected] --save " masalah terpecahkan. Upgrade tidak selalu merupakan pilihan terbaik.

+1

+1

Saya mendapatkan 2 pesan:

(node:9260) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0,
use `openUri()` instead, or set the `useMongoClient` option if using `connect()`
or `createConnection()`

Server started on port 3000

Db.prototype.authenticate method will no longer be available in the next major
release 3.x as MongoDB 3.6 will only allow auth against users in the admin db
and will no longer allow multiple credentials on a socket. Please authenticate
using MongoClient.connect with auth credentials.

Kesalahan pertama muncul di 4.11.0. Kesalahan kedua juga muncul di versi Mongoose sebelumnya.

plhosk, yang kedua seharusnya diperbaiki di 4.11 tetapi sepertinya masih ada, untuk saya juga.

+1

+1 dengan sedih.

Diinstal 4.10.8 tanpa masalah. Harap pertimbangkan untuk mengubah npm install mongoose --save ke default ke 4.10.8 hingga 11 stabil.

+1

+1

+1

+1

Saya juga menemukan masalah ini.
__Versi simpul__: v6.10.0

Lingkungan __MongoDB__: (Saya menjalankan wadah buruh pelabuhan Mongo versi terbaru)

2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] db version v3.4.5
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] git version: 520b8f3092c48d934f0cd78ab5f40fe594f96863
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1t  3 May 2016
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] modules: none
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] build environment:
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten]     distmod: debian81
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten]     distarch: x86_64
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten]     target_arch: x86_64
2017-06-20T08:04:24.509+0000 I CONTROL  [initandlisten] options: { security: { authorization: "enabled" } }

Konfigurasi koneksi saya:

var dbURL = `mongodb://${dbHost}:${dbPort}/${dbName}?authSource=admin`;
var dbAuth = { 
    useMongoClient: false
    user: dbUser,
    pass: dbPass
}
mongoose.connect(dbURL, dbAuth);

Ketika saya menggunakan useMongoClient untuk menjadi salah. Luwak menunjukkan peringatan berikut:

(node:7868) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`
Express server listening on port 3222 in development mode
Db.prototype.authenticate method will no longer be available in the next major release 3.x as MongoDB 3.6 will only allow auth against users in the admin db and will no longer allow multiple credentials on a socket. Please authenticate u
sing MongoClient.connect with auth credentials.

Tapi itu bekerja dengan baik.

Namun, ketika saya mengaturnya ke true , saya menemukan kesalahan ini:

Unhandled rejection MongoError: not authorized on users to execute command { listIndexes: "sessions", cursor: {} }
    at Function.MongoError.create (<my project path>\node_modules\mongoose\node_modules\mongodb-core\lib\error.js:31:11)
    at queryCallback (<my project path>\node_modules\mongoose\node_modules\mongodb-core\lib\cursor.js:212:36)
    at <my project path>\node_modules\mongoose\node_modules\mongodb-core\lib\connection\pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

Saya juga mencoba untuk menghapus authSource=admin dari URL koneksi juga, tetapi tetap tidak berhasil

(node:451) DeprecationWarning: open() tidak digunakan lagi di luwak >= 4.11.0, gunakan
openUri() sebagai gantinya, atau atur opsi useMongoClient jika menggunakan connect() atau createConnection()
Metode Db.prototype.authenticate tidak akan lagi tersedia di referensi utama berikutnya
sewa 3.x karena MongoDB 3.6 hanya akan mengizinkan autentikasi terhadap pengguna di admin db dan w
sakit tidak lagi mengizinkan banyak kredensial pada soket. Harap autentikasi menggunakan M
ongoClient.connect dengan kredensial auth.

Saya mendapatkan masalah ini dengan versi luwak 4.11.0 dan MongoDB versi 3.4.5

+1

+1

Menggunakan

mongoose.createConnection(URI)

@nandofalcao Saat menggunakan:

  • luwak.createConnection (URI);
  • luwak.connect (URI, {useMongoClient: true});

Ternyata saya tidak bisa menyimpan rekor baru.

let userSchema = mongoose.Schema({ name: String });
let User = mongoose.model('User', userSchema);
let joao = new User({ name: 'NewJoao ' });
joao.save((err) => err ? throw err : console.log('User created!'));//nothing happens

Menambahkan polyglot malam ini dan +1 mengalami ini.

// Load Mongoose
const mongoose = require('mongoose');
// import mongoose from 'mongoose' didn't give access to .connect()

// Use native Promises
mongoose.Promise = global.Promise;

// Connect database
export const Mongoose = new Promise((resolve, reject) => {
  const uri = `mongodb://${Singleton.currentConfig.databases.mongodb.host}/${Singleton.currentConfig.databases.mongodb.database}`;

  const options = {
    user: Singleton.currentConfig.databases.mongodb.user,
    pass: Singleton.currentConfig.databases.mongodb.password,
    server: {
      reconnectTries: Singleton.currentConfig.databases.mongodb.reconnectTries,
      reconnectInterval: Singleton.currentConfig.databases.mongodb.reconnectInterval,
      socketOptions: {
        keepAlive: Singleton.currentConfig.databases.mongodb.keepAlive,
        connectTimeoutMS: Singleton.currentConfig.databases.mongodb.connectTimeoutMS
      },
    },
  };

  // Initiate document store
  mongoose.connect(uri, options)

  // Check for anomalies
  .then((connected) => {
    if (mongoose.connection.readyState !== 1) {
      reject(connected);
    }
    resolve(connected);
  })

  // Complete meltdown
  .catch((error) => {
    console.log(`MongoDB Connection Error: ${error}`);
    process.exit(0);
  });
});

+1

dan saya mendapatkan pesan ke-2:

[2017-06-27 16:14:23.702] [INFO] :: - Server dimulai di port 2000

(node:1193) DeprecationWarning: open() tidak digunakan lagi di luwak >= 4.11.0, gunakan openUri() sebagai gantinya, atau setel opsi useMongoClient jika menggunakan connect() atau createConnection()

Metode Db.prototype.authenticate tidak akan lagi tersedia di rilis utama 3.x berikutnya karena MongoDB 3.6 hanya akan mengizinkan autentikasi terhadap pengguna di admin db dan tidak akan lagi mengizinkan banyak kredensial pada soket. Harap autentikasi menggunakan MongoClient.connect dengan kredensial autentikasi.

+1

+1

+1

+1

+1

Adakah yang bisa mengunci ini untuk mencegah +1 yang tidak berguna?

Sebagai rasa hormat kepada pelanggan utas ini, harap berhenti membalas dengan +1 karena itu menghasilkan pemberitahuan email yang tidak berguna. Ini bukan forum. Jika Anda ingin mengikuti utas ini, gunakan tombol berlangganan di bilah sisi kanan. Anda juga dapat melakukan riset sendiri dan menyumbangkan solusi.

Saya mengubah versi kembali ke 4.10.8 dan sekarang berfungsi dengan baik.

Sepertinya ValYouW memiliki potensi perbaikan untuk masalah pemuatan dokumen di sini: #5404

luwak.koneksi.openUri('mongodb://127.0.0.1/camp_v12')

apakah ada yang mencoba ini? peringatan usang saya hilang ketika saya menggunakan ini, itu dari dokumentasi

http://mongoosejs.com/docs/connections.html

@crisamdegracia yang menganggap Anda sudah memiliki koneksi

// Or, if you already have a connection
connection.openUri('mongodb://localhost/myapp', { /* options */ });

yang tidak (setidaknya saya karena saya dulu terhubung ke mongodb menggunakan metode luwak.connect)

mongoose.connect(config.get('mongo'), {
  useMongoClient: true,
});

Saya tidak dapat menemukan dokumen apa pun... Ada apa?

+1

Jadi setelah melihat masalah tertaut dari @ phased90 yang menjelaskan bahwa Anda dapat terhubung seperti ini:

const mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/test', {useMongoClient: true})
    .then(() => {
        let Cat = mongoose.model('Cat', {name: String});
        let kitty = new Cat({name: 'Zildjian'});

        kitty.save(err => {
            if (err) {
                console.log(err);
            } else {
                console.log('meow');
            }
        });
    })
    .catch(err => console.error(err));

Saya melakukan penyelaman cepat melalui kode dan tampaknya 4.11 mengembalikan MongooseThenable kecuali ketika opsi {useMongoClient: true} disediakan. Dalam contoh itu ia memanggil Connection.prototype.openUri yang mengembalikan contoh baru Promise.ES6 . Haruskah panggilan Connection.prototype.openUri itu dibungkus dengan MongooseThenable ?

Saya minta maaf atas pertanyaannya, ini adalah pertama kalinya saya melihat basis kode ini jadi saya agak tidak yakin. Tetapi saya akan dengan senang hati mencoba dan membantu memberikan perbaikan jika saya bisa mendapatkan klarifikasi tentang apakah Moongoose.prototype.connect harus selalu mengembalikan instance MongooseThenable .

Ketahuilah bahwa menggunakan {useMongoClient: true} akan menyebabkan Connection.prototype.openUri dipanggil, yang tidak memicu perintah buffered yang dibuat __before__ menghubungkan ke DB karena #5404

+1

Maaf, hal-hal telah gila, akan kita lihat sebentar.

@varunjayaraman tidak perlu minta maaf sobat. Orang bisa menunggu, atau mencoba memperbaikinya sendiri.

+1

Jadi mengenai masalah aktual yang dibuka, peringatan penghentian bukan bug, itu hanya peringatan: luwak akan menghentikan logika koneksinya saat ini, jadi Anda harus memasukkan param useMongoClient . Ini dapat ditemukan di dokumentasi

Pada catatan terpisah, sepertinya ini adalah perubahan yang melanggar mundur, semoga ini bisa diperbaiki di rilis kecil berikutnya (atau mungkin tidak, saya hampir tidak tidur di sini):

ini biasanya akan berfungsi (simpan untuk bagian useMongoClient , yang baru):

const mongoose = require('mongoose');
const co = require('co');
mongoose.Promise = global.Promise;
const GITHUB_ISSUE = `gh-5399`


exec()
  .then(() => {
    console.log('successfully ran program');
    process.exit(0);
  })
  .catch(error => {
    console.error(`Error: ${ error }\n${ error.stack }`);
  });


function exec() {
  return co(function*() {
    const db = mongoose.createConnection(`mongodb://localhost:27017/${ GITHUB_ISSUE }`, { useMongoClient: true })
    const schema = new mongoose.Schema({
      name: String
    });


    const Model = db.model('Model', schema);
  });
}

Ini sepertinya menimbulkan kesalahan bagi saya karena db.model bukan lagi fungsi.

Saat menggunakan mongoose.model , ini berfungsi:

const mongoose = require('mongoose');
const co = require('co');
mongoose.Promise = global.Promise;
const GITHUB_ISSUE = `gh-5399`


exec()
  .then(() => {
    console.log('successfully ran program');
    process.exit(0);
  })
  .catch(error => {
    console.error(`Error: ${error}\n${error.stack}`);
  });


function exec() {
  return co(function* () {
    const db = mongoose.connect(`mongodb://localhost:27017/${GITHUB_ISSUE}`, { useMongoClient: true })

    return db
      .then(() => {
        const schema = new mongoose.Schema({
          name: String
        });


        const Model = mongoose.model('Model', schema);

        return Model.create({ name: 'test' });
      })
      .then(doc => console.log(doc));

  });
}

@varunjayaraman Saya baru saja memperbarui Mongoose dan menggunakan useMongoClient: true seperti yang Anda sarankan, tetapi saya memiliki masalah.
Itu tidak mendukung, menurut opsi dokumentasi Mongoose resmi , user , dan pass :

the options [user] is not supported
the options [pass] is not supported

Dan, ya, gagal untuk mengautentikasi. :-1:

Saya akan mencoba menambahkan pengguna dan memasukkan string koneksi sebagai gantinya.
Ini berfungsi ketika saya menambahkan nama pengguna dan kata sandi ke dalam string koneksi. Mungkin Anda harus memperbarui dokumentasi. 😐.

@itpcc coba gunakan versi 4.10.8 adalah solusi terbaik saat ini.

npm remove mongoose
npm install [email protected] --save

Kredit: @Chenz62

@CQBinh Terima kasih atas saran Anda. Saya sudah membaca komentar tentang itu.
Namun, saya tidak berpikir menggunakan versi yang lebih lama adalah solusi terbaik untuk saat ini. Dan itu dapat diselesaikan dengan memasukkan ke dalam string koneksi.
Saya hanya merasa bingung karena disebutkan dalam dokumen tetapi tidak berhasil. :/
BTW, saya laporkan sebagai masalah baru di sini

@varunjayaraman jika db.model tidak ada lagi, bagaimana menangani beberapa koneksi luwak yang berbeda dengan model yang berbeda?

misalnya model1 dan model2 dilampirkan ke luwakConnection1 dan model3 dan model4 dilampirkan ke luwakConnection2.

Sebelumnya ini dilakukan dengan memanggil mongoose.createConnection untuk setiap koneksi, dan melampirkan model ke masing-masing nilai kembalian ini.

Sunting: Atau masih berfungsi dalam kasus ini:

const conn = mongoose.createConnection(...);
const Model = conn.model('ModelName', schema);

+1

@boyce-ywr SERIUS, +1 lagi??? Ada apa dengan kalian??
Berikan komentar yang membangun, bukan hal-hal seperti itu.

Mengenai luwak, tidak jelas bagi saya apakah metode mongoose.connect() akan diganti di rilis mendatang atau tidak. Seseorang bisa menjelaskan tolong?

@simonemazzoni Anda benar, mereka mengirim SPAM kepada kami.

Jika Anda ingin disertakan dalam pemberitahuan untuk utas ini, Anda hanya perlu berlangganan (ada tombol di bagian atas utas),

Semua yang Anda lakukan ketika Anda memberi +1 adalah mengirim semua orang ke sini email yang mengatakan

Halo aku disini!

Kami tidak peduli , kami menunggu komentar dan solusi yang membangun.

Juga mengapa tidak Anda semua +1 menghapus posting Anda dari daftar ini, mereka merusak pemandangan dan rasa sakit di belakang harus menggulir melewati hanya untuk mendapatkan komentar yang sebenarnya.

Seperti yang dikatakan beberapa orang sebelumnya, satu-satunya "solusi" adalah kembali ke [email protected]_ ...
Setidaknya untuk sekarang!

Sepertinya bug, kembali ke [email protected] untuk menyelesaikan masalah

Gunakan mongoose.createConnection(...) alih-alih mongoose.connect(...)

Berikut adalah contoh kerja lengkap menggunakan [email protected] berdasarkan rekomendasi @diegoazh

const mongoose = require('mongoose')
mongoose.Promise = require('bluebird')  // optional, use this to get rid of 
                                        // the mpromise DeprecationWarning
const conn = mongoose.createConnection('mongodb://localhost/testDB')
const Schema = mongoose.Schema

const UserSchema = new Schema({
    username: String,
    email: String
})

const User = conn.model('User', UserSchema)
module.exports = User

@midnightcodr Jadi kita putuskan koneksi dan gunakan createConnection saja?

@bertolo1988 seperti yang disarankan ppl tentang masalah ini, saat ini ada dua solusi

  1. Kembali ke 4.10.8
  2. Gunakan pola baru jika Anda ingin tetap menggunakan versi baru
const conn = mongoose.createConnection(...)
const Model = conn.model(...)

Saya pribadi lebih suka solusi kedua.

Terima kasih!!!
diselesaikan dengan createConnection, dan gunakan koneksi itu untuk membuat model (bukan luwak)

let mongoose = require('mongoose');

mongoose.Promise = global.Promise;

module.exports = mongoose;
const mongoose = require('./set-mongoose');
module.exports = mongoose.createConnection('mongodb://localhost/advisorDemoTestDB');

Pola koneksi baru memerlukan beberapa perubahan kode, dan tergantung pada ukuran proyek Anda yang dapat berarti banyak waktu dan bahkan mungkin perubahan arsitektur (mengingat fakta bahwa membuat model memerlukan koneksi).

Akan sangat bagus jika model koneksi lama bisa membungkus model koneksi baru.

Ada banyak posting, jadi boleh saya coba rangkum:

  1. Peringatan itu adalah peringatan yang sudah usang, artinya, tidak perlu terburu-buru. Jika kita tidak mengubah apa pun, itu akan tetap berfungsi seperti biasanya, semuanya tampak baik-baik saja

  2. Menurut peringatan, connect() akan/telah dimodifikasi dan melewati useMongoClient akan menjadi suatu keharusan. Tapi inilah kemungkinan bug/masalahnya

  • connect('myurl', {useMongoClient: true}) => dokumen berhenti memuat dan tidak mungkin untuk menulis di db

  • connect('myurl', {useMongoClient: false}) => tampaknya berfungsi dengan baik tetapi peringatan masih ditampilkan

Oleh karena itu, tujuan dari masalah ini adalah untuk memperbaiki penggunaan useMongoClient jika terjadi pemanggilan metode connect.

Setuju?

Namun, sementara peringatan penghentian memang "hanya" peringatan, yang muncul membuat saya bertanya-tanya kapan itu benar-benar akan dihapus. Jika luwak mengikuti semver, itu harus tetap ada di cabang 4.x. Oleh karena itu, ini harus tetap berfungsi dengan kompatibilitas mundur hingga 5.x dirilis.

Mengenai perubahan itu sendiri, agak menjengkelkan karena saya tidak dapat dengan cepat menemukan apa pun tentang perubahan ini kecuali yang disebutkan di log perubahan. Dan bahkan ketika Anda mengubahnya, barang tetap rusak dan menurut beberapa orang di sini, itu karena panggilan .model() .

Juga, bahkan dokumen masih menunjukkan mongoose.connect() dan mongoose.model() , yang membuat masalah ini semakin membingungkan. Perubahan mongoose.connect() hanya disebutkan di bawah Kumpulan koneksi, dan tidak di bagian lain halaman ini . Jadi pertanyaannya tetap, apakah perubahan ini bug, atau disengaja?

Saya tidak tahu ke mana arahnya, tetapi saya telah menghabiskan sebagian besar akhir pekan ini untuk mencoba mendapatkan koneksi ke Atlas MongoDB. Driver mongodb asli langsung aktif dan menjalankan hal-hal CRUD.

Namun mencoba membuat luwak pergi adalah mimpi buruk total. Jika saya menggunakan createConnection dengan 4.11 koneksi cluster terbunuh:

MongoError: connection 4 to cluster0-myshard.mongodb.net:27017 closed

Atau, saya bisa mengatur

useMongoClient: true

tapi kemudian saya tidak terdefinisi pada connection.model

<info> atlas-api-test.js:65 (Test.testVendors) conn.model undefined

@Archomeda tidak ada rencana untuk menghapus perilaku koneksi lama di 4.x, dan 5.x diblokir untuk mendapatkan logika koneksi baru ke kondisi stabil. Ada dokumen pada dokumen koneksi yang akan ditingkatkan 4.11.1 dan tautannya akan membantu. Re: panggilan model() , jika Anda menentukan useMongoClient: true , createConnection() tidak akan mengembalikan koneksi, melainkan janji yang menyelesaikan koneksi yang Anda perlukan .then() aktif. Dasar pemikiran dijelaskan di sini: https://github.com/Automattic/mongoose/issues/5404#issuecomment -312522539 Jangan ragu untuk menyuarakan keprihatinan apa pun tentang masalah ini #5404 .

@mkastner sepertinya Anda menggunakan createConnection() . Dengan useMongoClient: true , createConnection() mengembalikan janji yang menyelesaikan koneksi. Silakan gunakan await mongoose.createConnection() atau mongoose.createConnection().then()

@peterpeterparker #5404 menunjukkan masalah dengan logika koneksi baru yang akan diperbaiki di 4.11.1, yang akan dirilis dalam 24 jam ke depan.

@cosminn777 masalah arsitektur apa yang Anda alami? Silakan buka masalah terpisah untuk membahasnya. Rencana jangka panjangnya adalah di 5.x kami tidak akan mendukung Node < 4, jadi semua orang yang menggunakan luwak akan memiliki akses asli ke generator dan/atau async/menunggu, jadi perubahan ini akan semudah menambahkan yield atau await pernyataan.

@alanpurple masalah yang Anda maksud sama dengan yang disebutkan #5404 dan akan diperbaiki dengan 4.11.1.

@itpcc Saya membuka masalah terpisah untuk melacak #5432. Untuk saat ini, harap masukkan nama pengguna/sandi Anda di URI: var dbURL = mongodb://${dbUser}:${dbPass}@${dbHost}:${dbPort}/${dbName}?authSource= admin`.

Secara umum, terima kasih semuanya atas kesabaran Anda dalam mencoba perilaku baru ini. Saya menyadari bahwa peralihan akan menyebabkan sakit kepala, itulah sebabnya kami menyembunyikan perilaku ini di balik bendera, tetapi beberapa perubahan yang terjadi untuk MongoDB 3.6 memerlukan perombakan total logika koneksi internal luwak. Saya berharap logika koneksi baru akan menghasilkan lebih sedikit bug koneksi khusus luwak dalam jangka panjang, tetapi harap bersabar saat kami menyelesaikan perilaku dan dokumentasi. Tanggapan Anda sangat dihargai.

Selama Anda menggunakan 4.x logika koneksi Anda saat ini akan berfungsi, itu hanya akan mencetak peringatan. Sementara itu, jangan ragu untuk melaporkan masalah apa pun yang Anda miliki dalam masalah github terpisah.

Baru saja mengadopsi metode baru dan itu bekerja dengan baik. Terimakasih semuanya!

@vkarpov15 terima kasih atas klarifikasinya.

Sebagai FYI, peringatan penghentian yang sama dilemparkan dengan openSet juga (saya menggunakan set replika).

Jadi untuk meringkas, aman untuk mengabaikan peringatan ini untuk saat ini karena hanya terkait dengan cara kerja internal Mongoose, dan kita dapat mencoba menggunakan useMongoClient tetapi belum harus.

Seberapa stabil menurut Anda? Apakah ini aman untuk digunakan? Saya tidak ingin menghabiskan 2 jam untuk memfaktorkan ulang semua model dan logika koneksi kami untuk mengetahui bahwa itu masih tidak dapat digunakan dalam produksi.

Apakah mungkin untuk menghapus peringatan penghentian sampai saat penggunaan flag stabil dan cara yang disarankan untuk terhubung ke depan? Atau apakah titik itu sudah tercapai?

@vkarpov15

Tapi saya menggunakan async di createConnection. Saya telah menyiapkan dua tes terhadap server db. Yang pertama adalah tes canary mongo-js asli untuk memastikan url berfungsi dan saya dapat menulis dan membaca:

tape('test connection via mongo native', async function testMongoConnection(t) {

  try {

    t.plan(1);
    let db = await MongoClient.connect(dbURL);
    await db.collection('users').insert({name: 'username'});
    let result = await db.collection('users').find({});
    let docs = await result.toArray();
    log.info('result', await result.toArray());
    t.equal(1, docs.length);
    db.collection('users').remove({});

    await db.close();

  } catch (err) {
  console.error(err)
  }
});

Hasil:

2017-07-04T09:00:34+0200 <info> atlas-api-test.js:28 (Test.testMongoConnection) result [ { _id: 595b3d1146734207bad88f9d, name: 'username' } ]
✔ should be equal

Berhasil dengan uji luwak menggunakan luwak createConnection dengan menunggu:

tape('test connection via mongoose', async function testMongooseConnection(t) {

  try {
      let conn = await mongoose.createConnection(dbURL, {
        useMongoClient: true,
        /*
        // tried these settings too
        user: 'myUserName',
        pass: 'myPassword',
        connectTimeoutMS: 30000,
        rs_name: 'myReplSetName',
        ssl: true,
        auto_reconnect: true,
        */
      });

      let UserSchema = new mongoose.Schema({
        name: String,
      });

      let User = mongoose.model('User', UserSchema);
      let newUser = new User({name: 'username'});
      let createdUser = await newUser.save();

      // just ending test without validating any results
      t.end();

  } catch (err) {
    log.error(err);
  }

});

Dan itu melempar kesalahan berikut:

/mypath/node_modules/mongodb/lib/replset.js:390 process.nextTick(function() { throw err; })
                                    ^
MongoError: connection 8 to cluster0-shard-00-02-c4nst.domain.com:27017 closed at Function.MongoError.create (/mypath/node_modules/mongodb-core/lib/error.js:29:11)
at Socket.<anonymous> (/mypath/node_modules/mongodb-core/lib/connection/connection.js:202:22)
at Object.onceWrapper (events.js:316:30)
at emitOne (events.js:115:13)
at Socket.emit (events.js:210:7)
at TCP._handle.close [as _onclose] (net.js:549:12)`

Saya mungkin sangat salah di sini, tetapi bagi saya itu tidak terlihat seperti masalah async/promise;

Saya menggunakan Mongo Atlas. Ketika saya menggunakan {useMongoClient: true}, aplikasi saya akan berhasil terhubung ke database tetapi database tidak merespons aplikasi, bukan?

kode saya:
mongoose.connect(config.dbhost, {useMongoClient: true}, function(err){ if(err){ console.log(err); } else { console.log('connected to the database successfuly.'); } });

Hanya pemberitahuan untuk semua orang karena saya belum melihatnya disebutkan di sini: 4.11.1 telah dirilis dan setelah melihat sekilas tampaknya masalah buffering saat menggunakan useMongoClient=true telah diperbaiki. Saya akan menguji lebih banyak besok. Ada orang lain?

Apa solusi akhir?

Ini berhasil untuk saya (v.4.11.1):

database.js

mongoose.connect(databaseUri, { useMongoClient: true })
      .then(() => console.log(`Database connected at ${databaseUri}`))
      .catch(err => console.log(`Database connection error: ${err.message}`));

pengguna.model.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userSchema = new Schema({ ... });
const User = mongoose.connection.model('User', userSchema);

MEMPERBARUI

Referensi koneksi mungkin tidak diperlukan saat menginisialisasi model Anda (terima kasih, @kyrylkov @peterpeterparker):

pengguna.model.js

const User = mongoose.model('User', userSchema);

Bisakah seseorang menjelaskan secara singkat untuk apa { useMongoClient: true } atau untuk apa flag itu?

Saya sedikit tersesat, apa keuntungan menggunakannya?

Maksud saya, seperti yang saya katakan sebelumnya, saya bisa hidup dengan peringatan sehingga saya tidak merasa terburu-buru untuk menambahkan param ini.
Tidak menemukan banyak di doc, thx sebelumnya untuk membersihkannya.

@Blackbaud-SteveBrush Ini tidak berfungsi. Saya menggunakan Mongo Atlas. Mengapa tidak bekerja?

@Thinkdiff

Tidak bekerja bagaimana? Ini berfungsi untuk kami di mLab dan MongoDB Atlas dengan biasa:

const User = mongoose.model('User', userSchema);

dari pada:

const User = mongoose.connection.model('User', userSchema);

Jika saya mencoba mengaktifkan opsi useMongoClient dengan beberapa host yang ditentukan dalam URI, Itu hang dan kemudian melempar kesalahan:
MongoError: no mongos proxy available at Timeout._onTimeout (/home/ubuntu/code/pss/node_modules/mongoose/node_modules/mongodb-core/lib/topologies/mongos.js:636:28) at ontimeout (timers.js:386:14) at tryOnTimeout (timers.js:250:5) at Timer.listOnTimeout (timers.js:214:5) name: 'MongoError', message: 'no mongos proxy available'
uri: mongodb://10.0.1.49 ,10.0.2.158,10.0.3.84/pss
opsi: { useMongoClient: true, autoReconnect: true, keepAlive: 300000, connectTimeoutMS: 30000 }

Bagi siapa pun yang tertarik, berikut adalah dokumen Mongoose pada parameter useMongoClient : http://mongoosejs.com/docs/connections.html#use -mongo-client

"Logika koneksi default Mongoose tidak digunakan lagi pada 4.11.0... Penghentian ini karena driver MongoDB telah menghentikan API yang penting bagi logika koneksi luwak untuk mendukung MongoDB 3.6, lihat masalah github ini untuk detail lebih lanjut." Inilah masalah GitHub: https://github.com/Automattic/mongoose/issues/5304

@Blackbaud-SteveBrush terima kasih telah menunjukkan bahwa kami. Jadi jika saya mengerti dengan benar

useMongoClient = true => aktifkan logika koneksi baru yang juga akan bekerja dengan Mongo 3.6
useMongoClient = false => nilai default. logika koneksi lama < 4.11.0. yang sudah dikucilkan.

Baik?

@Blackbaud-SteveBrush tentang kode Anda, dalam kasus saya, saya tidak menggunakan

const User = mongoose.connection.model('User', userSchema);

tetapi

const User = mongoose.model('User', userSchema);

dan itu masih berhasil. Terima kasih

Luwak bekerja untuk saya 4.10.8 :|

Saya telah menemukan bahwa ini kemungkinan bug dengan luwak

masalah hilang setelah memutar kembali versi luwak

npm uninstall -simpan luwak
npm install -save [email protected]

Saya benar-benar mengabaikan peringatan ini dan semuanya berfungsi seperti yang diharapkan. Mungkin, ini solusi untuk saat ini. Abaikan saja.

memutar kembali ke 4.10.8 membuat koneksi saya berfungsi kembali namun saya masih mendapatkan kesalahan

Db.prototype.authenticate method will no longe against users in the admin db and will no long connect with auth credentials.

@peterpeterparker benar. Kode autentikasi Mongoose saat ini tidak akan berfungsi pada mongodb 3.6 berdasarkan pemahaman saya, jadi useMongoClient mewakili kami yang mencoba mengatasi masalah ini sambil mempertahankan kompatibilitas mundur. Sejauh yang saya tahu belum ada tanggal rilis yang dijadwalkan untuk mongodb 3.6, jadi beralih tidak mendesak.

@adamreisnz kami memiliki beberapa bug tetapi sebenarnya logika koneksi baru adalah pembungkus yang sangat tipis menggunakan fungsi MongoClient.connect() driver asli, yang telah menjadi metode pilihan untuk menghubungkan ke mongodb selama beberapa tahun sekarang. Setelah koneksi Anda dibuat, logika driver mongodb yang sama mempertahankan koneksi. useMongoClient seharusnya hanya mempengaruhi koneksi awal.

@vkarpov15 thx banyak untuk penjelasannya dan tentu saja untuk pekerjaannya, sangat menghargainya!

@vkarpov15 terima kasih, saya akan mencobanya dan beralih menggunakan useMongoClient dan melihat ke mana kita akan dibawa.

const luwak = membutuhkan("luwak");
const db = " mongodb://localhost/testaroo ";

luwak.koneksi.openUri(db);
luwak.koneksi.once("buka", fungsi () {
console.log("koneksi berhasil");
}).on("kesalahan", fungsi (kesalahan) {
console.log(kesalahan);
})

--Saya menggunakan ini dan tidak ada kesalahan yang ditemukan

var mongoose = require('mongoose');
mongoose.Promise = global.Promise;

var mongoDB = mongoose.connect('mongodb://your_database', {
    useMongoClient: true
});

mongoDB
    .then(function (db) {
        console.log('mongodb has been connected');
    })
    .catch(function (err) {
        console.log('error while trying to connect with mongodb');
    });

module.exports = mongoDB;

Saya menggunakan ini dan tidak ada kesalahan yang ditemukan

@vitorbarros Ini berhasil untuk saya. Terima kasih!

Ini bekerja untuk saya:
http://mongoosejs.com/docs/connections.html#use-mongo-client

Saya menjalankan tes cepat ini dan berhasil:

// index.js
const mongoose = require('mongoose')
mongoose.Promise = global.Promise;
const db = mongoose.createConnection(`mongodb://localhost/test`)

db.on('error', err => console.log(err))
db.once('open', () => {
  console.log(`Connected to Mongo at: ${new Date()}`)
  db.close(() => {
    console.log(`Disconnected from Mongo at: ${new Date()}`)
  })
})

kemudian node index.js memberi saya:

Connected to Mongo at: Thu Jul 13 2017 22:54:50 GMT+0000 (UTC)
Disconnected from Mongo at: Thu Jul 13 2017 22:54:50 GMT+0000 (UTC)

Terima kasih semua!

@vitorbarros solusi Anda berhasil! Terima kasih.

Saya dapat mengonfirmasi bahwa dengan 4.11.3 mengganti logika koneksi dengan apa yang disarankan @vitorbarros menghapus peringatan dan tampaknya berfungsi dengan baik 👍

Tidak perlu refactor referensi model seperti yang disarankan sebelumnya di sini di utas ini.

Solusi @vitorbarros memang cara yang disarankan menurut dokumentasi "The useMongoClient Option" .

Namun, perhatikan bahwa mongoose.Promise = global.Promise; akan _not_ menjanjikan driver Mongo yang mendasarinya . Menurut dokumentasi "Promises for the MongoDB Driver" , properti promiseLibrary juga harus disetel di objek opsi dari metode connect .

Sebagai contoh:

var mongoDB = mongoose.connect('mongodb://your_database', {
    useMongoClient: true,
    promiseLibrary: global.Promise
});

global.Promise akan menggunakan mesin promise asli. Secara alami, Anda juga dapat menggunakan Bluebird atau mesin lainnya, misalnya promiseLibrary: require('bluebird')

@vitorbarros solusi bekerja untuk saya. Dan juga kita perlu menggunakan promiseLibrary seperti yang dikatakan @boaz-amit.
Tetapi cara mana yang terbaik untuk menggunakan data otentikasi?
Di URL

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

atau lebih baik mengatur pengguna dan kata sandi dalam opsi? Saya tidak dapat menemukan tempat yang tepat untuk saat ini.

Ini hanya satu cara untuk mengautentikasi?

Dan inilah solusi saya. Ini juga berfungsi bahkan jika koneksi pertama gagal.

let firstConnectTimeout = null;
const mongoConnect = () => {
    const mongoDB = mongoose.connect('mongodb://localhost/test', {
        useMongoClient: true
    });

    mongoDB
        .then((db) => {
            clearTimeout(firstConnectTimeout);
        })
        .catch((err) => {
            firstConnectTimeout = setTimeout(mongoConnect, 5000);
        });
};

mongoConnect();

Itu harus di url, opsi pengguna/pass tidak lagi berfungsi
useMongoClient benar saya temukan.

Pada Senin, 17 Juli 2017, 20:28 Andrey Prisniak [email protected]
menulis:

@vitorbarros https://github.com/vitorbarros solusi bekerja untuk saya. Dan
kita juga perlu menggunakan promiseLibrary seperti @boaz-amit
https://github.com/boaz-amit berkata.
Tetapi cara mana yang terbaik untuk menggunakan data otentikasi? Di URL
mongodb://[ nama pengguna:kata sandi@
]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
atau lebih baik mengatur pengguna dan kata sandi dalam opsi? Saya tidak dapat menemukan tempat yang tepat untuk
sekarang.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/Automattic/mongoose/issues/5399#issuecomment-315694642 ,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAd8Qup1YY4lhUhQccv2kLKtraARxvP0ks5sOxs_gaJpZM4OEnIt
.

@adamreisnz @aprisniak sedang mengerjakannya, lihat #5419. Sementara itu, harap masukkan nama pengguna dan kata sandi di URI Anda: mongodb://user:pass<strong i="7">@hostname</strong>:port/db

Juga, saya menulis posting blog tentang opsi ini dan mengapa itu perlu: http://thecodebarbarian.com/mongoose-4.11-use-mongo-client.html

@vkarpov15 Saya menggunakan user:pass di URI, tetapi masih ada peringatan.

Bagi mereka yang menggunakan luwak dengan gridfs-stream:

const mongooseConnect = mongoose.connect(
    process.env.MONGODB_URI || process.env.MONGOLAB_URI,
    {
        useMongoClient: true
    }
)

let gfs
mongooseConnect.then(conn => {
    gfs = Grid(conn.db)
    /** Setting up GFS storage here */
})

Semoga kalian menambahkan opsi koneksi yang hilang "useMongoClient" pada pengetikan TypeScript", dan menambahkan pengetikan kembali ke proyek ini sebagai gantinya untuk menambahkan paket pengetikan.

Saya tidak yakin apakah saya harus melakukan sesuatu dengan peringatan ini atau tidak? Ini akan diperbaiki, kan?

Saya baru saja menambahkan useMongoClient dalam pengetikan untuk membuatnya berfungsi. @iamdubx

@FinalDes bagaimana? Saya menambahkan mongoose.connect(process.env.DATABASE, { useMongoClient: true }) tetapi saya masih menerima pesan tersebut. Dan saya menggunakan user:pass in URI

Cara yang lebih baik untuk menghilangkan masalah tersebut adalah dengan menggunakan dua perintah ini:
npm uninstall -simpan luwak
npm install -save [email protected]

NB: [email protected] adalah versi stabil.

Bagaimana Anda semua menangani pembuatan Skema dan Model Anda serta mengaksesnya?

Saya sudah mencoba setiap perbaikan di utas. Dengan peringatan, semuanya berfungsi dengan baik. Setelah saya mencoba useMongoClient: true atau mongoose.createConnection itu menghilangkan peringatan dan saya dapat terhubung ke db, namun kode apa pun yang mencoba mengakses model gagal dipicu. Tidak ada kesalahan, kode tidak pernah berjalan.

@iamdubx
hanya kehilangan pengetikan, jadi ketika dijalankan dengan "noImplicitAny": true , tidak akan ada kesalahan

import luwak = membutuhkan("luwak");
import dotenv = membutuhkan("dotenv");
dotenv.config();
luwak.Janji = global.Janji;
const MONGO_URI=`mongodb://${process.env.MONGODB_HOST}:${process.env.MONGODB_PORT}/${process.env.MONGODB_DB}`;
luwak.koneksi(MONGO_URI, {
gunakanMongoClient: benar,
});

@FinalDes apa yang Anda maksud? Pengetikan apa yang hilang? Saya memiliki kode yang sama di atas dan memiliki kesalahan.

Saya mengalami masalah yang sama dengan @Snow-Okami

  1. const mongoDB = mongoose.connect(config.database, { useMongoClient: true });
    Ini menghilangkan peringatan dan menghubungkan ke db. Namun, semua yang mencoba mengakses model gagal (dapatkan/posting). Tidak ada pengembalian kesalahan.
  2. const mongoDB = mongoose.connect(config.database, function(){ useMongoClient: true });
    Dan ini memberikan dua peringatan itu, tetapi segala sesuatu selain itu berfungsi dengan baik.

Tolong setidaknya berikan kompatibilitas mundur server pembuatan produksi kami gagal.
pembaruan fitur bagus tetapi tidak mengubah tanda tangan atau panggilan metode.

@Nikunjksanghavi Ini hanya peringatan, tidak ada yang gagal.

@iamdubx kesalahan apa?

@FinalDes deprecation error, apa lagi yang kita bicarakan dalam topik ini?

Ini berhasil untuk saya: (v.4.11.4)

const MONGO_URI = process.env.MONGO_URI
const mongoose = require('mongoose');

// Use your own promis library
mongoose.Promise = require('bluebird');

// connect to mongo, use Mongo Client
mongoose.connect(MONGO_URI, {useMongoClient: true})
  .then(({db: {databaseName}}) => console.log(`Connected to ${databaseName}`))
  .catch(err => console.error(err));

const poemSchema = mongoose.Schema({
    name: String,
    text: String
});

const Poem = mongoose.model('Poem', poemSchema);

const insertPoem = poem =>
  (new Poem(poem)).save( (err, newPoem) => 
    console.log(err || newPoem));

insertPoem({name: 'poemName', text: 'this is a poem'})

// koneksi DB
var luwak = membutuhkan('luwak');
luwak.Janji = global.Janji;
luwak.connect('mongodb://localhost/login_register', {
gunakanMongoClient: benar
})
.then(() => console.log('koneksi berhasil'))
.catch((err) => console.error(err));
// koneksi DB berakhir

Ini tidak bekerja untuk saya. Saya masih memiliki peringatan konsol. Dan tidak ada penjelasan yang jelas memberikan.

Luwak itu mengerikan. Juga situs dokumentasi terburuk yang saya lihat di perpustakaan yang begitu populer. Sayang sekali!

Sekarang saya berpikir untuk beralih ke RethinkDB. Linux Foundation - ini serius.
Juga Postgre luar biasa.

Mongo - sangat, sangat memalukan.

@iamdubx apakah Anda mencoba solusi saya di atas? Bisakah Anda menempelkan peringatan ini? Mungkin saya bisa membantu :)

@iamdubx dapat memposting pesan peringatan Anda?

@FinalDes @shams-ali Saya memposting sebelumnya, ini adalah kesalahan penghentian yang sama dengan topik. Salah satu topik ini adalah tentang!

(node:3304) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client
Server listening on port: 7777
Db.prototype.authenticate method will no longer be available in the next major release 3.x as MongoDB 3.6 will only allow auth against users in the admin db and will no longer allow multiple credentials on a socket. Please authenticate using MongoClient.connect with auth credentials.

@iamdubx menarik, itu peringatan yang sama yang saya miliki dan solusi di atas yang saya posting sepertinya memperbaikinya untuk saya. Bisakah Anda menempelkan kode yang diperbarui yang tidak berfungsi?

Inilah yang berhasil untuk saya:

// ES6 promises
mongoose.Promise = Promise;

// mongodb connection
mongoose.connect("mongodb://localhost:27017/sandbox", {
  useMongoClient: true,
  promiseLibrary: global.Promise
});

var db = mongoose.connection;

// mongodb error
db.on('error', console.error.bind(console, 'connection error:'));

// mongodb connection open
db.once('open', () => {
  console.log(`Connected to Mongo at: ${new Date()}`)
});

@afoke berfungsi terima kasih

@FinalDes Sama -sama sobat.

Ini adalah alur kerja baru saya, mencoba untuk mematuhi peringatan dan penghentian:

// db.js
const model = require('./model');
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;


async function db(uri) {
  const con = await mongoose
    .createConnection(uri, {
      useMongoClient: true,
    });

  const {User} = model(con);

  // do something with User
  ...

  // the interface for the server
  return {
    create: params => User.create(params),
    ...
  };
}


module.exports = db;

Dan sekarang modul model mengembalikan fungsi koneksi

// model.js
const {Schema} = require('mongoose');


const UserSchema = new Schema({
  name: String,
  age: Number,
});

// Other Schemas
...

module.exports = con => ({
  User: con.model('User', UserSchema),
  ...
});

Adakah pedoman resmi tentang masalah ini?

@iamdubx Sepertinya Anda tidak mengerti perbedaan antara warning dan error .

Peringatan yang dimaksud tidak merusak apa pun, tetapi memperingatkan pengguna tentang sesuatu yang akan dihapus di rilis utama berikutnya.

Luwak itu mengerikan.

Jadi perlu diingat, Anda mengalami reaksi ini terhadap pengembang yang memperingatkan Anda sebelumnya sebelum mereka menghapus fitur. Saya juga mendorong Anda untuk mengingat bahwa Anda menggunakan ini secara gratis, jadi mungkin beri pengembang keuntungan dari keraguan sebelum Anda membuat ulah

@chrisdothtml

Peringatan yang dimaksud tidak merusak apa pun, tetapi memperingatkan pengguna tentang sesuatu yang akan dihapus di rilis utama berikutnya.

Itu mencemari tes dan konsol yang agak mengganggu.

Luwak itu mengerikan. Juga situs dokumentasi terburuk yang saya lihat di perpustakaan yang begitu populer. Sayang sekali!

Dia bersikap tidak sopan yang juga agak mengganggu tetapi dia membuat poin yang sangat valid sehubungan dengan dokumentasi Mongoose. Ini bukan dokumentasi terburuk yang pernah ada tetapi itu benar-benar dapat ditingkatkan.

Fakta bahwa luwak meneruskan API klien mongo. yang bekerja dengan cara yang sangat berbeda, membuat penggunaan dan dokumentasi Mongoose membingungkan.

Solusi yang mungkin untuk ini adalah:

  • berhenti melakukannya
  • hapus dokumentasi untuk metode klien Mongo
  • menyediakan cara untuk berbagi koneksi antara klien resmi dan Mongoose

Saya juga menyarankan untuk meningkatkan kemampuan penelusuran dokumen dengan memecahnya menjadi beberapa halaman dan memberikan lebih banyak wawasan kepada pengguna baru tentang apa yang sebenarnya dilakukan Mongoose untuk mencapai beberapa hasil.

Saya mengalami kesalahan ini, tetapi hilang setelah saya menambahkan opsi {useMongoClient: true}.
Saya menggunakan Debian 9, versi pengujian, dengan MongoDb ver. 3.2.11 dan versi luwak. 4.10.4.
Saya memiliki pesan 'Terhubung ke MongoDB' (lihat kode dalam TypeScript di bawah), semuanya berfungsi dengan baik.

(< apapun > luwak).Janji = global.Janji;
mongoose.connect(process.env.MONGODB_URI, {useMongoClient: true});
const db = luwak.koneksi;
db.on('kesalahan', console.error.bind(konsol, 'kesalahan koneksi:'));
db.once('buka', () => {
console.log('Terhubung ke MongoDB');
setRoutes(aplikasi);
app.get('/*', function(req, res) {
res.sendFile(path.join(__dirname, '../public/index.html'));
});
app.listen(app.get('port'), () => {
console.log('Aplikasi Saya mendengarkan di port ' + app.get('port'));
});
});

Hapus saja versi luwak saat ini yang Anda miliki dan instal versi yang lebih rendah npm install [email protected] --save . Tidak perlu melakukan hal lain ini pasti akan berhasil untuk Anda.

mongoose.connect(database.host, { useMongoClient: true });

Ini memecahkan masalah saya. Tapi saya mendapat peringatan lain setelah saya melakukan perubahan ini.

DeprecationWarning: Mongoose: mpromise (perpustakaan janji default luwak) sudah usang, colokkan perpustakaan janji Anda sendiri sebagai gantinya: http://mongoosejs.com/docs/promises.html

Kode ini menyelesaikan semua peringatan penghentian:
```javascript
luwak.Janji = global.Janji;
luwak.koneksi(uri, {
keepAlive: benar,
reconnectTries: Number.MAX_VALUE,
gunakanMongoClient: benar
});
````
Info lebih lanjut dengan tautan -> http://mongoosejs.com/docs/connections.html#use -mongo-client

@bricss Fantastis! Terima kasih!

@bricss Anda membuat hari saya menyenangkan.

seseorang mendapatkan lencana pahlawan...

edit: @bricss Ini menghilangkan peringatan penghentian untuk saya, tetapi saya tidak dapat mengambil data dari kotak pasir mLab saya. Mungkin karena mereka menggunakan versi MongoDB yang lebih lama. nanti saya coba cek.

edit: @bricss Sekarang berfungsi dengan benar dengan luwak 4.11.9 terbaru dan koneksi ke Cosmos DB di Azure.

@bricss : Batu bata yang bagus! Ini bekerja untuk saya meskipun saya menggunakan versi mongodb yang sangat lama di lokal saya :+1:

@bricss Luar biasa! Tetapi Anda mungkin mempertimbangkan untuk memasukkan angka yang lebih kecil untuk "reconnectTries". Anda tidak ingin menghabiskan sepanjang hari untuk menghubungkan kembali jika ada masalah dengan DB Anda.

Solusi @afoke bekerja untuk saya, hanya ketika saya secara eksplisit mendeklarasikan db dalam string koneksi yaitu mongodb://localhost:27017/test tetapi tidak mongodb://localhost:27017

Bolehkah saya membuat koneksi ke 2 DB tanpa peringatan ini? Saya perlu menggunakan model saya dengan DB yang berbeda.

Menggunakan luwak v^4.11.6 , ketika ditambahkan useMongoClient peringatan itu hilang.

const uri = "http://blablabla.blo/blaDB"; mongoose.Promise = global.Promise; mongoose.connection.on('error', (err) => { console.error( Kesalahan koneksi luwak: ${err}`);
proses.keluar(1);
});
luwak.connect(uri, {useMongoClient: true});

 // load models
 require('./model1');
 // ...
 require('./modelN');`

menghubungkan ke database dengan cara ini memecahkan masalah:
mongoose.connect(url,{user:'username',pass:'mypassword',useMongoClient:true});

Apakah kesalahan ini akan menimbulkan masalah, misalnya dalam hal keamanan?

Tidak ada lagi peringatan "usang" yang muncul jika saya menggunakan sintaks ini

mongoose.connection.openUri('mongodb://localhost/test')
  .once('open', () => console.log('Good to go !'))
  .on('error', (error) => {
    console.warn('Warning', error);
  });

Saya menghadapi peringatan penghentian yang sama seperti di bawah ini:
(node:2300) DeprecationWarning: open() tidak digunakan lagi di luwak >= 4.11.0, gunakan openUri() sebagai gantinya, atau setel opsi useMongoClient jika menggunakan connect() atau createConnection() . Lihat http://mongoosejs.com/docs/connections.html#use -mongo-client

Larutan

Saya mencoba yang berikut ini dan berfungsi dengan baik. Tidak memberikan peringatan penghentian.

mongoose.connect('mongodb://127.0.0.1:27017/your-database-name', { useMongoClient: true, promiseLibrary: global.Promise });

Semoga ini akan membantu semua orang menghadapi masalah ini.

Saya memiliki masalah yang sama tetapi ketika mencoba terhubung ke layanan Mongo Atlas itu tidak terhubung dengan opsi {useMo ngoClient:true } dan tanpanya koneksi tidak lagi dijalankan.

Adakah yang memiliki masalah yang sama?

Saya telah memecahkan masalah saya dengan hanya mengubah luwak.koneksi ke luwak.createConnection

luwak.createConnection(config.uri, (err) => {
jika (salah) {
console.log('TIDAK BISA terhubung ke database: ', err);
} lain {
console.log('Tersambung ke database: ' + config.db);
}
});

Saya memecahkan masalah ini seperti itu (Mongoose 4.12.0, NodeJS - 7.10.1)

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb://localhost:27017/books_exchange', {
  useMongoClient: true,
  promiseLibrary: require('bluebird')
}).then(() => {
  var userSchema = new mongoose.Schema({
    name: String,
    password: String
  });
  var User = mongoose.model('User', userSchema);

  var person = new User({
    name: "John",
    password: "qwerty"
  });

  person.save().then(() => {
    console.log('Data saved');
  }).catch(e => {
    console.log(e);
  });
}).catch(e => {
  console.log('Error while DB connecting');
  console.log(e);
});
Apakah halaman ini membantu?
0 / 5 - 0 peringkat