Arhn - архитектура программирования

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

Я использую 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 на самом деле не закрывают соединение, когда вы его спрашиваете, есть ли все еще выполняющиеся запросы.

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

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

11.01.2012

  • Есть ли способ сделать это, просто импортировав модель? ни один из следующих ответов не работает: \ 04.02.2016
  • Я не могу сказать из вопроса, пробовали ли вы его, но он должен работать (т.е. закрыть соединение), если вы примените решение Кенана внутри асинхронной функции после ожидания запросов. 24.02.2021

Ответы:


1

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

mongoose.connection.close()
11.01.2012
  • Это фактически закрывает соединение. Однако этот вызов очищал содержимое моей базы данных. Когда я переключился на mongoose.disconnect (), все работало правильно, и мои тесты мокко снова начали работать правильно. 24.05.2014
  • Это сработало для меня. Мне просто нужно было убедиться, что я поместил это в правильный обратный вызов, иначе он, вероятно, закрывал соединение, прежде чем сохранение в базе данных могло быть завершено. Честно говоря, я все еще использую простой скрипт, который просто подключается к локальной базе данных и сохраняет простой пример пользовательского объекта. В обратном вызове user.save () я вызываю mongoose.connection.close (). 02.12.2015
  • Как видите, это старые ответы. Если вы используете Mongoose 5.0.4, метод Connection.close() только экспортируется, только доступно, так что используйте его. 09.02.2018

  • 2

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

    23.11.2013
  • Это также предпочтительно при разрыве тестовой среды. 11.01.2017
  • mongoose.disconnect () лучше использовать, и это логичный подход. 07.01.2018

  • 3

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

    var db = mongoose.connect('mongodb://localhost:27017/somedb');
    
    // Do some stuff
    
    db.disconnect();
    
    24.10.2015
  • В моей ситуации (тестирование Mongoose внутри Jest) это единственное решение, которое сработало. 05.06.2016
  • Я делаю Model.update (..) с Mongoose внутри цикла for. Обязательно ли закрывать соединение после каждого обновления? Мой сервер должен обрабатывать много обновлений и через некоторое время перестал работать. 01.11.2016
  • Тот же ответ, что и ниже 30.01.2017

  • 4

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

    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()
    })
    

    в противном случае, когда я проверял его в своей среде, у него была ошибка.

    03.03.2020

    5

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

    var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true })
    
    //do stuff
    
    db.close()
    
    07.03.2018
  • устарело в mongoose 5.x 25.01.2021
  • его лучше использовать mongoose.disconnect () 11.02.2021

  • 6

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

    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');
    });
    
    26.03.2018

    7

    Вероятно, у вас есть это:

    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();
    });
    
    20.04.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..