Feche corretamente a conexão do mangusto quando terminar


145

Estou usando o mangusto em um script que não deve ser executado continuamente e estou enfrentando o que parece ser um problema muito simples, mas não consigo encontrar uma resposta; basta colocar uma vez que eu chamo uma função de mangusto que envia solicitações ao mongodb, minha instância do nodejs nunca para e eu tenho que matá-la manualmente com, por exemplo, Ctrl + c ou Program.exit ().

O código é mais ou menos assim:

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);

Tentei adicionar chamadas ao mongoose.disconnect (), mas não como resultado. Além disso, tudo funciona bem (encontrar, salvar, ...).

Esse é exatamente o mesmo problema que essa pessoa; infelizmente, ele não recebeu nenhuma resposta: https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

obrigado

EDIT: aceitou a resposta abaixo, pois é tecnicamente correta, mas se alguém encontrar esse problema novamente, parece que o mongoose e / ou o driver mongodb não fecham a conexão quando você solicita se ainda houver consultas em execução.

Ele nem se lembra da chamada de desconexão, e não faz isso depois que as consultas são concluídas; apenas descarta sua ligação sem nenhuma exceção ou algo do tipo e nunca fecha a conexão.

Então está aí: certifique-se de que todas as consultas tenham sido processadas antes de chamar o métodoconnect () se você quiser que realmente funcione.


1
Existe uma maneira de fazer isso apenas importando um modelo? nenhuma das respostas abaixo funciona: \
Anthony

Respostas:


201

Você pode fechar a conexão com

mongoose.connection.close()

25
Isso de fato fecha a conexão. No entanto, esta chamada estava limpando o conteúdo do meu banco de dados. Quando eu mudei para mongoose.disconnect () tudo funcionou corretamente e meus testes mocha começou a trabalhar corretamente novamente
Brian Noah

1
Isso funcionou para mim. Eu só precisava ter certeza de colocar isso no retorno de chamada correto, caso contrário, provavelmente estava fechando a conexão antes de salvar no banco de dados. Para ser justo, ainda estou usando um script simples que se conecta ao banco de dados local e salva um objeto de usuário de exemplo simples. No retorno de chamada para user.save () é onde chamo mongoose.connection.close ().
FateNuller

6
Como você pode ver, essas respostas são antigas. Se você estiver usando o Mongoose 5.0.4 , o Connection.close()método será exportado apenas, disponível apenas, então use-o.
91318

74

A outra resposta não funcionou para mim. Eu tive que usar mongoose.disconnect();como indicado nesta resposta .


Isso também é preferido ao destruir um ambiente de teste.
Matt Lo

1
mongoose.disconnect () é melhor usar e uma abordagem lógica.
Abdul Alim Shakir

17

Você pode definir a conexão como uma variável e desconectá-la quando terminar:

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

// Do some stuff

db.disconnect();

Na minha situação (testar Mongoose dentro Jest) esta é a única solução que funcionou
Código Whisperer

Eu faço Model.update (..) com o Mongoose em um loop for. É necessário fechar a conexão após cada atualização? Meu servidor precisa lidar com muitas atualizações e parou de funcionar depois de um tempo.
Pille

Mesma resposta que abaixo
Daniel W.

3

Estou usando a versão 4.4.2 e nenhuma das outras respostas funcionou para mim. Mas adicionar useMongoClientas opções e colocá-lo em uma variável que você chama closeparecia funcionar.

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

//do stuff

db.close()

1

Você receberá um erro se tentar fechar / desconectar fora do método. A melhor solução é fechar a conexão nos dois retornos de chamada no método O código fictício está aqui.

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

Assim como Jake Wilson disse: Você pode definir a conexão como uma variável e desconectá-la quando terminar:

let db;
mongoose.connect('mongodb://localhost:27017/somedb').then((dbConnection)=>{
    db = dbConnection;
    afterwards();
});


function afterwards(){

    //do stuff

    db.disconnect();
}

ou se dentro da função assíncrona:

(async ()=>{
    const db = await mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: 
                  true })

    //do stuff

    db.disconnect()
})

caso contrário, quando eu estava verificando-o no meu ambiente, ocorreu um erro.


0

Provavelmente você tem isso:

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

// Do some stuff

db.disconnect();

mas você também pode ter algo parecido com isto:

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

const model = mongoose.model('Model', ModelSchema);

model.find().then(doc => {
  console.log(doc);
}

você não pode ligar, db.disconnect()mas pode fechar a conexão depois de usá-la.

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.