Правильно закройте соединение Мангуста, как только вы закончите - PullRequest
118 голосов
/ 11 января 2012

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

Спасибо

РЕДАКТИРОВАТЬ: принял ответ ниже, поскольку он технически корректен, но если кто-то когда-либо сталкивался с этой проблемой снова, кажется, что mongoose и / или драйвер mongodb фактически не закрывают соединение, когда вы спрашиваете, есть ли еще запросы работает.

Он даже не запоминает вызов разъединения, он не делает этого после завершения запросов; он просто отбрасывает ваш звонок без каких-либо исключений или что-то в этом роде и фактически никогда не закрывает соединение.

Итак, у вас есть: убедитесь, что каждый запрос был обработан перед вызовом disnect (), если вы хотите, чтобы он действительно работал.

Ответы [ 6 ]

173 голосов
/ 11 января 2012

Вы можете закрыть соединение с помощью

mongoose.connection.close()
62 голосов
/ 23 ноября 2013

Другой ответ не работал для меня. Я должен был использовать mongoose.disconnect();, как указано в этот ответ .

12 голосов
/ 24 октября 2015

Вы можете установить соединение с переменной, а затем отключить его, когда закончите:

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

// Do some stuff

db.disconnect();
3 голосов
/ 07 марта 2018

Я использую версию 4.4.2, и ни один из других ответов не работал для меня.Но добавление useMongoClient к опциям и помещение его в переменную, которую вы называете close, похоже, сработало.

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

//do stuff

db.close()
1 голос
/ 26 марта 2018

Вы получите ошибку, если попытаетесь закрыть / отключить за пределами метода.Лучшее решение - закрыть соединение в обоих обратных вызовах метода.Пустой код здесь.

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');
});
0 голосов
/ 20 апреля 2019

Возможно, у вас есть это:

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();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...