Правильно закрийте з'єднання мангуста, як тільки ви закінчите


145

Я використовую мангуст у сценарії, який не повинен працювати постійно, і я стикаюся з тим, що здається дуже простим питанням, але я не можу знайти відповідь; просто кажучи, коли я здійснюю виклик до будь-якої мангустової функції, яка надсилає запити в mongodb, мій екземпляр 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

Дякую

EDIT: прийняв відповідь нижче, оскільки це технічно правильно, але якщо хтось коли-небудь знову потрапить на цю проблему, здається, що мангуст та / або драйвер mongodb насправді не закриває з'єднання, коли ви запитуєте його, чи все ще запущені запити.

Він навіть не запам'ятовує виклик відключення, він не робить цього, як тільки запити закінчуються; він просто відкидає ваш дзвінок без винятку, кинутого або будь-якого подібного, і ніколи фактично не закриває з'єднання.

Отож, у вас це є: переконайтеся, що кожен запит був оброблений, перш ніж викликати disconnect (), якщо ви хочете, щоб він справді працював.


1
Чи є спосіб зробити це лише з імпорту моделі? жодна з наведених нижче відповідей не працює: \
Ентоні

Відповіді:


201

Ви можете перервати зв’язок із

mongoose.connection.close()

25
Це фактично закриває зв'язок. Однак цей дзвінок очищав вміст моєї бази даних. Коли я перейшов на mongoose.disconnect (), все працювало належним чином, і мої тести на мокву знову почали працювати належним чином
Брайан Ной,

1
Це працювало для мене. Мені просто потрібно було переконатися, що я помістив це в правильний зворотний дзвінок, інакше він, ймовірно, закривав з'єднання перед тим, як зберегти в базі даних був шанс закінчити. Справедливості, я все ще використовую простий скрипт, який просто підключається до локального db і зберігає простий об'єкт-приклад користувача. У зворотному дзвінку до user.save () я називаю mongoose.connection.close ().
FateNuller

6
Як бачите, ці відповіді старі. Якщо ви використовуєте Мангуст 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();

У моїй ситуації (тестування Мангуста всередині Jest) це єдине рішення, яке спрацювало
Code Whisperer

Я роблю Model.update (..) з Mongoose в межах циклу for. Чи потрібно закривати з'єднання після кожного оновлення? Мій сервер повинен обробити безліч оновлень і через деякий час перестав працювати.
Піл

Та сама відповідь, що нижче
Даніель В.

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.