İşiniz bittiğinde Firavun faresinin bağlantısını uygun şekilde kapatın


145

Ben sürekli çalıştırmak için olmayan bir komut dosyası içinde mongoose kullanıyorum ve çok basit bir sorun gibi görünüyor henüz karşı karşıya değilim ama bir cevap bulamıyorum; basitçe nodejs örneğimin hiçbir zaman durmadığı mongodb'a istek gönderen herhangi bir mongoose işlevine çağrı yaptığımda ve Ctrl + c veya Program.exit () ile manuel olarak öldürmek zorunda kaldım.

Kod kabaca şöyle görünür:

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

Mongoose.disconnect () çağrıları eklemeyi denedim ama sonuç yok. Bunun yanı sıra, her şey iyi çalışıyor (bulma, kaydetme, ...).

Bu kişi ile aynı sorun, ne yazık ki herhangi bir cevap almadı: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

Teşekkürler

DÜZENLEME: teknik olarak doğru olduğu için aşağıdaki yanıtı kabul ettiyse de, kimse bu sorunu tekrar vurursa, hala çalışan sorgular olup olmadığını sorduğunuzda mongoose ve / veya mongodb sürücüsünün bağlantıyı gerçekten kapatmamış gibi görünüyor.

Bağlantıyı kesme çağrısını bile hatırlamıyor, sorgular çalışmayı bitirdikten sonra yapmıyor; sadece herhangi bir istisna ya da herhangi bir şey olmadan çağrınızı atar ve bağlantıyı asla kapatmaz.

Yani burada: gerçekten çalışmasını istiyorsanız disconnect () çağırmadan önce her sorgunun işlendiğinden emin olun.


1
Bunu sadece bir modeli içe aktarmaktan yapmanın bir yolu var mı? aşağıdaki cevapların hiçbiri işe yaramaz: \
Anthony

Yanıtlar:


201

İle bağlantıyı kapatabilirsiniz

mongoose.connection.close()

25
Bu aslında bağlantıyı kapatır. Ancak bu çağrı veritabanımdaki içeriği temizliyordu. Ben mongoose.disconnect () 'a geçiş yaptığımda her şey düzgün çalıştı ve mocha testlerim tekrar düzgün çalışmaya başladı
Brian Noah

1
Bu benim için çalıştı. Ben sadece bu doğru geri arama yerleştirilen emin olmak gerekiyordu ya da başka muhtemelen veritabanına kaydetme bitirmek için bir şans vardı önce bağlantı kapatıyordu. Adil olmak gerekirse, hala sadece yerel db'ye bağlanan ve basit bir örnek kullanıcı nesnesini kaydeden basit bir komut dosyası kullanıyorum. User.save () çağrısında mongoose.connection.close () çağrdığım yer.
FateNuller

6
Gördüğünüz gibi, bu cevaplar eskidir. Eğer kullanıyorsanız Mongoose 5.0.4 , yöntem sadece bu yüzden kullanmak, sadece, ihraç edilmektedir. Connection.close()
Константин Ван

74

Diğer cevap benim için işe yaramadı. Bu cevaptamongoose.disconnect(); belirtildiği gibi kullanmak zorunda kaldım .


Bu, bir test ortamını yıkarken de tercih edilir.
Matt Lo

1
mongoose.disconnect () kullanımı daha mantıklı ve mantıklı bir yaklaşımdır.
Abdul Alim Shakir

17

Bir değişkenin bağlantısını ayarlayabilir ve işiniz bittiğinde bağlantısını kesebilirsiniz:

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

// Do some stuff

db.disconnect();

Benim durumumda (Mongoose'u Jest içinde test ediyor) bu işe
Code Whisperer

Bir for döngüsü içinde Mongoose ile Model.update (..) yapıyorum. Her güncellemeden sonra bağlantıyı kapatmak gerekiyor mu? Sunucum birçok güncellemeyi işlemeli ve bir süre sonra çalışmayı durdurdu.
Pille

Aşağıdaki ile aynı cevap
Daniel W.

3

4.4.2 sürümünü kullanıyorum ve diğer yanıtların hiçbiri benim için çalışmadı. Ancak useMongoClientseçeneklere eklemek ve çağırdığınız bir değişkene koymak işe yaramış gibi closegörünüyordu.

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

//do stuff

db.close()

1

Yöntemin dışında kapatmaya / bağlantıyı kesmeye çalışırsanız bir hata alırsınız. En iyi çözüm, yöntemdeki her iki geri aramada bağlantıyı kapatmaktır. Sahte kod burada.

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');
});

1

Tıpkı Jake Wilson'ın dediği gibi: Bir değişkenle bağlantı kurabilir ve işiniz bittiğinde bağlantısını kesebilirsiniz:

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


function afterwards(){

    //do stuff

    db.disconnect();
}

veya Async işlevinin içindeyse:

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

    //do stuff

    db.disconnect()
})

Aksi takdirde benim ortamda kontrol ederken bir hata var.


0

Muhtemelen buna sahipsiniz:

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

// Do some stuff

db.disconnect();

ancak bunun gibi bir şeye de sahip olabilirsiniz:

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

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

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

arayamazsınız, db.disconnect()ancak bağlantıyı kullandıktan sonra kapatabilirsiniz.

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.