Tutup koneksi luwak dengan benar setelah selesai

145

Saya menggunakan luwak dalam naskah yang tidak dimaksudkan untuk berjalan terus-menerus, dan saya menghadapi apa yang tampaknya menjadi masalah yang sangat sederhana namun saya tidak dapat menemukan jawaban; cukup masukkan begitu saya melakukan panggilan ke fungsi luwak mana pun yang mengirim permintaan ke simpulong misalnya tidak pernah berhenti dan saya harus membunuhnya secara manual dengan, katakanlah, Ctrl + c atau Program.exit ().

Kira-kira kode ini terlihat seperti ini:

var mongoose = require('mongoose');

// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ?
mongoose.connect('mongodb://localhost:27017/somedb'); 

// define some models

// if I include this line for example, node never stop afterwards
var MyModel =  mongoose.model('MyModel', MySchema);

Saya mencoba menambahkan panggilan ke mongoose.disconnect () tetapi tidak ada hasilnya. Selain itu, semuanya berfungsi dengan baik (menemukan, menyimpan, ...).

Ini adalah masalah yang sama persis dengan orang ini, sayangnya dia tidak menerima jawaban apa pun: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

Terima kasih

EDIT: menerima jawaban di bawah karena secara teknis sudah benar, tetapi jika ada yang pernah mengenai masalah ini lagi, sepertinya luwak dan / atau driver mongodb tidak benar-benar menutup koneksi ketika Anda menanyakannya jika masih ada pertanyaan yang berjalan.

Bahkan tidak ingat panggilan putuskan sama sekali, itu tidak melakukannya setelah permintaan selesai berjalan; itu hanya membuang panggilan Anda tanpa terkecuali atau semacamnya, dan tidak pernah benar-benar menutup koneksi.

Jadi begitulah: pastikan bahwa setiap permintaan telah diproses sebelum memanggil putuskan sambungan () jika Anda ingin benar-benar berfungsi.

Lepidosteus
sumber
1
Apakah ada cara untuk melakukan ini hanya dengan mengimpor model? tak satu pun dari jawaban di bawah ini yang berfungsi: \
Anthony

Jawaban:

201

Anda dapat menutup koneksi dengan

mongoose.connection.close()
Kenan
sumber
25
Ini sebenarnya menutup koneksi. Namun panggilan ini membersihkan konten di basis data saya. Ketika saya beralih ke mongoose.disconnect () semuanya bekerja dengan baik dan tes mocha saya mulai bekerja dengan baik lagi
Brian Noah
1
Ini berhasil untuk saya. Saya hanya perlu memastikan saya menempatkan ini di callback yang benar atau mungkin itu menutup koneksi sebelum menyimpan ke database memiliki kesempatan untuk menyelesaikannya. Agar adil, saya masih menggunakan skrip sederhana yang hanya terhubung ke db lokal dan menyimpan contoh objek pengguna yang sederhana. Dalam panggilan balik ke user.save () adalah tempat saya memanggil mongoose.connection.close ().
FateNuller
6
Seperti yang Anda lihat, jawaban ini sudah tua. Jika Anda menggunakan Mongoose 5.0.4 , yang Connection.close()metode hanya diekspor, hanya tersedia, jadi gunakan itu.
Константин Ван
74

Jawaban lain tidak berhasil untuk saya. Saya harus menggunakan mongoose.disconnect();sebagaimana dinyatakan dalam jawaban ini .

msrxthr
sumber
Ini juga lebih disukai ketika menghancurkan lingkungan pengujian.
Matt Lo
1
mongoose.disconnect () lebih baik digunakan dan pendekatan yang logis.
Abdul Alim Shakir
17

Anda dapat mengatur koneksi ke variabel kemudian memutuskan itu ketika Anda selesai:

var db = mongoose.connect('mongodb://localhost:27017/somedb');

// Do some stuff

db.disconnect();
Jake Wilson
sumber
Dalam situasi saya (menguji Mongoose di dalam Jest) ini adalah satu-satunya solusi yang bekerja
Code Whisperer
Saya melakukan Model.update (..) dengan Mongoose dalam for-loop. Apakah perlu untuk menutup koneksi setelah setiap pembaruan? Server saya harus menangani banyak pembaruan dan berhenti bekerja setelah beberapa saat.
Pille
Jawaban yang sama seperti di bawah ini
Daniel W.
3

Saya menggunakan versi 4.4.2 dan tidak ada jawaban lain yang berfungsi untuk saya. Namun menambahkan useMongoClientopsi dan memasukkannya ke dalam variabel yang Anda panggil closetampaknya berhasil.

var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true })

//do stuff

db.close()
tumelo
sumber
1

Anda akan mendapatkan kesalahan jika Anda mencoba untuk menutup / memutuskan sambungan di luar metode. Solusi terbaik adalah dengan menutup koneksi di kedua panggilan balik dalam metode ini. Kode boneka di sini.

const newTodo = new Todo({text:'cook dinner'});

newTodo.save().then((docs) => {
  console.log('todo saved',docs);
  mongoose.connection.close();
},(e) => {
  console.log('unable to save');
});
Ramanand Prajapati
sumber
1

Seperti yang dikatakan Jake Wilson: Anda dapat mengatur koneksi ke suatu variabel kemudian memutuskannya ketika Anda selesai:

let db;
mongoose.connect('mongodb://localhost:27017/somedb').then((dbConnection)=>{
    db = dbConnection;
    afterwards();
});


function afterwards(){

    //do stuff

    db.disconnect();
}

atau jika di dalam fungsi Async:

(async ()=>{
    const db = await mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: 
                  true })

    //do stuff

    db.disconnect()
})

kalau tidak, ketika saya memeriksa di lingkungan saya ada kesalahan.

adir abargil
sumber
0

Mungkin Anda memiliki ini:

const db = mongoose.connect('mongodb://localhost:27017/db');

// Do some stuff

db.disconnect();

tetapi Anda juga dapat memiliki sesuatu seperti ini:

mongoose.connect('mongodb://localhost:27017/db');

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

model.find().then(doc => {
  console.log(doc);
}

Anda tidak dapat menelepon db.disconnect()tetapi Anda dapat menutup koneksi setelah menggunakannya.

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
Abraham Hernandez
sumber