2012-01-11 13 views
78

Sürekli çalışacağı anlamına gelen bir komut dosyasında mongoose kullanıyorum ve çok basit bir sorunun nasıl göründüğüne bakıyorum ama bir cevap bulamıyorum; sadece bir kez koymak mongodb istekleri gönderir herhangi bir firavun işlevine bir çağrı yapmaz benim nodejs örneğim asla durmaz ve ben, Ctrl + c veya Program.exit() ile elle öldürmek zorunda.Bir kez bittiğinde mongoose bağlantısını yakından kapat

kod şöyle kabaca 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); 

I() mongoose.disconnect çağrıları ekleyerek çalıştı ama hiçbir sonuçlanması. Bunun dışında her şey iyi çalışıyor (bulma, kaydetme, ...).

Bu, bu kişinin tamamen aynı konudur, ne yazık ki o herhangi bir cevap almadım: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

Teşekkür

DÜZENLEME: Hiç kimse bu çarptı eğer teknik olarak doğru aşağıda cevabını kabul etmesine karşın Yine sorun, görünüyor ki, hala çalışan sorguların olup olmadığını sorduğunuzda mongoose ve/veya mongodb sürücüsünün bağlantıyı gerçekten kapatmıyor.

Bağlantı kesme çağrısını hiç hatırlamıyor bile, sorguları bittiğinde bir kez yapmaz; sadece çağrıya atılan istisna ya da sıralamadaki herhangi bir şey olmadan çağrıyı atar ve asla bağlantıyı kesin olarak kapatmaz.

İşte size göre: her sorgunun, gerçekten çalışmasını istiyorsanız, bağlantıyı kesmeden önce işlendiğinden emin olun().

+0

Sadece bir modeli içe aktarmanın bir yolu var mı? Aşağıdaki cevaplardan hiçbiri işe yaramaz: \ – Antoine

cevap

128

diğer cevabı benim için işe yaramadı

mongoose.connection.close() 
+14

Bu aslında bağlantıyı kapatır. Ancak bu çağrı veritabanımdaki içeriği temizliyordu. Ne zaman mongoose.disconnect() için her şey düzgün çalıştı ve mocha testleri tekrar düzgün çalışmaya başladı –

+1

Bu benim için çalıştı. Sadece doğru bir geri bildirime yerleştirdiğimden emin olmalıydım ya da muhtemelen veritabanına kaydetmeden önce bağlantıyı kapatmanın bir şansı vardı. Adil olmak gerekirse, hala yerel db'ye bağlanan ve basit bir örnek kullanıcı nesnesini kaydeden basit bir komut dosyası kullanıyorum. User.save() işlevinin geri çağrılması, mongoose.connection.close() işlevini çağırdığım yerdir. – FateNuller

+0

Gördüğünüz gibi, bu cevaplar eski. _Mongoose 5.0.4_ kullanıyorsanız, ['Connection.close()' yöntemi] (http://mongoosejs.com/docs/api.html#connection_Connection-close) yalnızca dışa aktarılır, yalnızca kullanılabilir, bu yüzden kullanın . –

40

ile bağlantıyı kapatabilir. this answer'da belirtildiği gibi mongoose.disconnect(); kullanmak zorunda kaldım.

+0

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

+0

mongoose.disconnect() kullanımı daha iyi ve mantıklı bir yaklaşımdır. –

8

Sen bittiğinde daha sonra da bağlantısını bir değişkene bağlantı ayarlayabilirsiniz: Diğer cevapların sürümünü 4.4.2 ve hiçbiri kullanıyorum

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

// Do some stuff 

db.disconnect(); 
+0

Durumumda (Jest'in içinde Mongoose'u test etmek) bu, –

+0

üzerinde çalışan tek çözümdür. Mongoose ile bir for-döngüsü içinde Model.update (..) yapıyorum.Her güncellemeden sonra bağlantıyı kapatmak gerekiyor mu? Sunucum çok sayıda güncellemeyi yürütmeli ve bir süre sonra çalışmayı durdurdu. – Pille

+0

Aşağıdaki ile aynı cevap – DanFromGermany

1

benim için çalıştı. Ancak useMongoClient'un seçeneklere eklenmesi ve close aradığınız bir değişkene koyulması işe yaramış görünüyor.

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

//do stuff 

db.close()