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
+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:
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
@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.
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
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:
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
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);
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
const mongoDB = mongoose.connect(config.database, {
useMongoClient: true
});
const mongoDB = mongoose.connect(config.database, function(){
useMongoClient: true
});
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:
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);
});
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.