एक बार जब आप काम पूरा कर लेते हैं तो मोंगोज़ का कनेक्शन ठीक से बंद कर दें


145

मैं एक ऐसी स्क्रिप्ट का उपयोग कर रहा हूं, जो लगातार चलने के लिए नहीं है, और मैं सामना कर रहा हूं जो कि एक बहुत ही सरल मुद्दा प्रतीत होता है, फिर भी मुझे उत्तर नहीं मिल रहा है; बस एक बार डालने के बाद मैं किसी भी मैंगोज फंक्शन को कॉल करता हूं, जो मेरे नोडज उदाहरण को भेजने के अनुरोधों को कभी नहीं रोकता है और मुझे इसे मैन्युअल रूप से मारना है, जैसे कि Ctrl + c या Program.exit ()।

कोड इस तरह दिखता है:

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 () के लिए कॉल जोड़ने की कोशिश की, लेकिन परिणाम नहीं हुआ। उस के अलावा, सब कुछ ठीक काम करता है (खोज, बचत, ...)।

यह ठीक वैसा ही मुद्दा है जैसा इस व्यक्ति का है, दुख की बात है कि उसे कोई जवाब नहीं मिला: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

धन्यवाद

EDIT: नीचे दिए गए उत्तर को स्वीकार कर लिया क्योंकि यह तकनीकी रूप से सही है, लेकिन अगर किसी ने कभी भी इस समस्या को फिर से मारा, तो ऐसा लगता है कि मोंगोज़ और / या मोंगोडब ड्राइवर वास्तव में कनेक्शन को बंद नहीं करता है जब आप पूछते हैं कि क्या अभी भी प्रश्न चल रहे हैं।

यह डिस्कनेक्ट कॉल को बिल्कुल भी याद नहीं करता है, यह प्रश्न समाप्त होने के बाद एक बार नहीं करता है; यह आपके कॉल को बिना किसी अपवाद या किसी भी प्रकार के अपवाद के साथ जोड़ता है, और वास्तव में कनेक्शन को कभी बंद नहीं करता है।

इसलिए आपके पास यह है: सुनिश्चित करें कि डिस्कनेक्ट () को कॉल करने से पहले प्रत्येक क्वेरी को संसाधित किया गया है यदि आप चाहते हैं कि यह वास्तव में काम करे।


1
वहाँ सिर्फ एक मॉडल आयात करने से यह करने के लिए एक रास्ता है? नीचे दिए गए उत्तरों में से कोई भी काम नहीं करता है: \
एंथनी

जवाबों:


201

आप के साथ कनेक्शन बंद कर सकते हैं

mongoose.connection.close()

25
यह वास्तव में कनेक्शन को बंद करता है। हालाँकि यह कॉल मेरे डेटाबेस की सामग्री को साफ़ कर रहा था। जब मैंने mongoose.disconnect पर स्विच किया () सब कुछ ठीक से काम किया और मेरे मोचा परीक्षणों ने फिर से ठीक से काम करना शुरू कर दिया
ब्रायन नूह

1
इसने मेरे लिए काम किया। मुझे बस यह सुनिश्चित करने की आवश्यकता थी कि मैंने इसे सही कॉलबैक में रखा है या फिर यह संभवत: कनेक्शन को बंद कर रहा है इससे पहले कि डेटाबेस को बचाने का मौका खत्म हो गया। निष्पक्ष होने के लिए, मैं अभी भी एक साधारण स्क्रिप्ट का उपयोग कर रहा हूं जो सिर्फ स्थानीय डीबी से कनेक्ट होती है और एक सरल उदाहरण उपयोगकर्ता ऑब्जेक्ट को बचाता है। कॉलबैक में user.save () है जहाँ मैं mongoose.connection.close () कहता हूँ।
फेटनउलर

6
जैसा कि आप देख सकते हैं, ये उत्तर पुराने हैं। यदि आप Mongoose 5.0.4 का उपयोग कर रहे हैं , तो Connection.close()विधि केवल निर्यात की जाती है, केवल उपलब्ध है, इसलिए इसका उपयोग करें।
Константин Ван

74

अन्य उत्तर मेरे काम नहीं आया। मुझे इस उत्तरmongoose.disconnect(); में कहा गया है ।


परीक्षण के माहौल को तोड़ते समय यह भी पसंद किया जाता है।
मैट लो

1
mongoose.disconnect () का उपयोग करना बेहतर है और एक तार्किक दृष्टिकोण है।
अब्दुल अलीम शाकिर

17

आप एक चर के लिए कनेक्शन सेट कर सकते हैं तब इसे डिस्कनेक्ट करें जब आप कर रहे हैं:

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

// Do some stuff

db.disconnect();

मेरी स्थिति में (जेस्ट के अंदर मैंगोज का परीक्षण) यह एकमात्र समाधान है जिसने काम किया है
कोड व्हिस्परर

मैं एक लूप के भीतर Mongoose के साथ Model.update (..) करता हूं। क्या हर अपडेट के बाद कनेक्शन बंद करना जरूरी है? मेरे सर्वर को बहुत सारे अपडेट को संभालना है और थोड़ी देर बाद काम करना बंद कर दिया है।
पिल्ले

नीचे के रूप में एक ही जवाब
डैनियल डब्ल्यू।

3

मैं संस्करण 4.4.2 का उपयोग कर रहा हूं और किसी भी अन्य उत्तर ने मेरे लिए काम नहीं किया है। लेकिन useMongoClientविकल्पों में जोड़ना और इसे एक चर में डालना जिसे आप closeकाम करना कहते हैं।

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

//do stuff

db.close()

1

यदि आप विधि के बाहर बंद / डिस्कनेक्ट करने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी। सबसे अच्छा समाधान विधि में दोनों कॉलबैक में कनेक्शन को बंद करना है। डमी कोड यहाँ है।

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

जैसा कि जेक विल्सन ने कहा: आप एक चर के लिए कनेक्शन सेट कर सकते हैं तब इसे डिस्कनेक्ट कर सकते हैं जब आप कर रहे हैं:

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


function afterwards(){

    //do stuff

    db.disconnect();
}

या यदि Async फ़ंक्शन के अंदर:

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

    //do stuff

    db.disconnect()
})

अन्यथा जब मैं इसे अपने वातावरण में जाँच रहा था तो यह एक त्रुटि है।


0

संभवतः आपके पास यह है:

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

// Do some stuff

db.disconnect();

लेकिन आप कुछ इस तरह से भी हो सकते हैं:

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

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

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

आप कॉल नहीं कर सकते, db.disconnect()लेकिन आप इसका उपयोग करने के बाद कनेक्शन बंद कर सकते हैं।

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.