ปิดการเชื่อมต่อของพังพอนอย่างถูกต้องเมื่อเสร็จสิ้น


145

ฉันใช้พังพอนในสคริปต์ที่ไม่ได้หมายถึงการทำงานอย่างต่อเนื่องและฉันกำลังเผชิญกับสิ่งที่ดูเหมือนจะเป็นปัญหาที่ง่ายมาก แต่ฉันไม่สามารถหาคำตอบได้ เพียงแค่ใส่เมื่อฉันโทรไปที่ฟังก์ชั่นพังพอนใด ๆ ที่ส่งคำขอไปยัง MongoD อินสแตนซ์ของฉัน nodejs ไม่เคยหยุดและฉันต้องฆ่ามันด้วยตนเองด้วยพูด 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

ขอบคุณ

แก้ไข: ยอมรับคำตอบด้านล่างเนื่องจากมันถูกต้องทางเทคนิค แต่ถ้าใครเคยประสบปัญหานี้อีกครั้งดูเหมือนว่าพังพอนและ / หรือไดรเวอร์ Mongodb ไม่ได้ปิดการเชื่อมต่อจริง ๆ เมื่อคุณถามว่ายังมีคำถามทำงานอยู่หรือไม่

มันไม่จำแม้แต่การตัดการเชื่อมต่อเลย แต่ก็ไม่ได้ทำเมื่อการสืบค้นเสร็จสิ้น มันแค่ทิ้งสายของคุณโดยไม่มีข้อยกเว้นหรืออะไรก็ตามและไม่เคยปิดการเชื่อมต่อ

ดังนั้นคุณมีมัน: ตรวจสอบให้แน่ใจว่าทุกแบบสอบถามได้รับการประมวลผลก่อนที่จะโทรออก () ถ้าคุณต้องการให้มันใช้งานได้จริง


1
มีวิธีทำเช่นนี้เพียงแค่การนำเข้าแบบจำลองหรือไม่ ทั้งคำตอบด้านล่างไม่ทำงาน: \
แอนโธนี

คำตอบ:


201

คุณสามารถปิดการเชื่อมต่อด้วย

mongoose.connection.close()

25
ในความเป็นจริงนี้จะปิดการเชื่อมต่อ อย่างไรก็ตามการโทรนี้เป็นการล้างเนื้อหาในฐานข้อมูลของฉัน เมื่อฉันเปลี่ยนไปใช้ mongoose.disconnect () ทุกอย่างทำงานได้อย่างถูกต้องและการทดสอบมอคค่าของฉันเริ่มทำงานได้อย่างถูกต้องอีกครั้ง
Brian Noah

1
สิ่งนี้ใช้ได้สำหรับฉัน ฉันแค่ต้องตรวจสอบให้แน่ใจว่าฉันวางสิ่งนี้ลงในการติดต่อกลับที่ถูกต้องมิฉะนั้นอาจเป็นการปิดการเชื่อมต่อก่อนที่จะบันทึกลงในฐานข้อมูลมีโอกาสที่จะเสร็จสิ้น เพื่อความเป็นธรรมฉันยังคงใช้สคริปต์ง่ายๆที่เพิ่งเชื่อมต่อกับฐานข้อมูลท้องถิ่นและบันทึกวัตถุผู้ใช้ตัวอย่างอย่างง่าย ในการเรียกกลับไปยัง user.save () เป็นที่ที่ฉันเรียก mongoose.connection.close ()
FateNuller

6
อย่างที่คุณเห็นคำตอบเหล่านี้เก่า หากคุณกำลังใช้พังพอน 5.0.4 , วิธีการส่งออกเท่านั้นใช้ได้เฉพาะเพื่อใช้มัน Connection.close()
КонстантинВан

74

คำตอบอื่น ๆ ไม่ได้สำหรับฉัน ฉันต้องใช้mongoose.disconnect();ตามที่ระบุไว้ในคำตอบนี้


สิ่งนี้ยังเป็นที่ต้องการเมื่อฉีกสภาพแวดล้อมการทดสอบ
Matt Lo

1
mongoose.disconnect () ดีกว่าที่จะใช้และเป็นวิธีการทางตรรกะ
Abdul Alim Shakir

17

คุณสามารถตั้งค่าการเชื่อมต่อกับตัวแปรแล้วยกเลิกการเชื่อมต่อเมื่อคุณทำเสร็จแล้ว:

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

// Do some stuff

db.disconnect();

ในสถานการณ์ของฉัน (ทดสอบพังพอนภายใน Jest) นี่เป็นทางออกเดียวที่ทำงาน
Code Whisperer

ฉันทำ Model.update (.. ) กับ Mongoose ภายในวงวน จำเป็นต้องปิดการเชื่อมต่อหลังจากอัพเดททุกครั้งหรือไม่? เซิร์ฟเวอร์ของฉันต้องจัดการกับการอัปเดตจำนวนมากและหยุดทำงานหลังจากผ่านไประยะหนึ่ง
Pille

คำตอบเดียวกันกับด้านล่าง
Daniel W.

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

เช่นเดียวกับ Jake Wilson กล่าวว่า: คุณสามารถตั้งค่าการเชื่อมต่อกับตัวแปรแล้วยกเลิกการเชื่อมต่อเมื่อคุณทำเสร็จ

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();
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.