Правильно закройте соединение Мангуста, как только вы закончите

145

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

панцирные щуки
источник
1
Есть ли способ сделать это, просто импортировав модель? ни один из приведенных ниже ответов не работает: \
Энтони

Ответы:

201

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

mongoose.connection.close()
Кенан
источник
25
Это фактически закрывает связь. Однако этот вызов очищал содержимое моей базы данных. Когда я переключился на mongoose.disconnect (), все работало правильно, и мои тесты на мокко снова начали работать правильно
Брайан Ноа,
1
Это сработало для меня. Мне просто нужно было убедиться, что я поместил это в правильный обратный вызов, иначе он, вероятно, закрывал соединение, прежде чем сохранение в базу данных имело возможность завершиться. Честно говоря, я все еще использую простой скрипт, который просто подключается к локальной базе данных и сохраняет простой пример пользовательского объекта. В обратном вызове user.save () я вызываю mongoose.connection.close ().
FateNuller
6
Как видите, эти ответы старые. Если вы используете Мангуст 5.0.4 , метод только на экспорт, только, так что используйте его. Connection.close()
Константин Ван
74

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

msrxthr
источник
Это также предпочтительно при разрушении среды тестирования.
Мэтт Ло
1
mongoose.disconnect () лучше использовать и логично.
Абдул Алим Шакир
17

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

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

// Do some stuff

db.disconnect();
Джейк Уилсон
источник
В моей ситуации (тестирование Mongoose внутри Jest) это единственное сработавшее решение
Code Whisperer,
Я делаю Model.update (..) с Mongoose в цикле for. Нужно ли закрывать соединение после каждого обновления? Мой сервер должен обрабатывать много обновлений и перестал работать через некоторое время.
Pille
Тот же ответ, что и ниже
Даниэль В.
3

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

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

//do stuff

db.close()
tumelo
источник
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 ()=>{
    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();
});
Авраам Эрнандес
источник