/ / Mongoose e comandante - node.js, mongodb, mongoose

Mangusto e comandante - node.js, mongodb, mangusto

Estou escrevendo alguns scripts para manipulação de linha de comando de Mangusto modelos com commander.js (eventualmente, eu gostaria de executar essas ferramentas usando Cron).

Agora, eu escrevi vários scripts com commander e todos eles funcionam bem, mas se eu conectar ao banco de dados MongoDB usando mongoose, o script fica travado após a conclusão. Agora, imaginei que a conexão com o banco de dados mantinha o nó ativo, então adicionei um mongoose.disconnect() linha e ainda trava.

A única coisa que descobri que me permite desligar é usar process.exit(), mas estou relutante em encerrar o processo. Há algo em particular que devo fazer para desencadear um desligamento normal?

Respostas:

0 para resposta № 1

Minha leitura do Docs de API implica que .disconnect() devo receber uma função de retorno de chamada. Parece que é chamado para cada um que está desconectado e pode receber um erro.

Há uma verificação no código para garantir que seja "não é chamado se ele não existir quando as coisas dão certo, mas essa verificação não está sendo executada em erros; portanto, se o Mongoose recebeu uma mensagem de erro do cliente MongoDB, ele pode estar deixando uma conexão aberta e é por isso que " não está parando a execução.

Se você está apenas abrindo uma única conexão com o banco de dados, pode apenas chamar [Connection object].close() já que essa função insere corretamente um "retorno de chamada" não operacional se nenhum retorno de chamada for fornecido e parece que isso destruirá corretamente as coisas.

(Quanto mais eu olho para o Mongoose, mais quero escrever um invólucro fino em torno do cliente MongoDB para não precisar lidar com a ajuda do Mongoose.)


0 para resposta № 2

Eu uso o async "Series" para executar operações e depois chamar mongoose.connection.close () na conclusão. Impede o inferno de retorno de chamada e permite que você execute operações ordenadamente, uma de cada vez ou em paralelo, seguidas por uma função quando todos os outros métodos forem concluídos. Eu o uso o tempo todo para scripts que requerem mangusto, mas devem terminar após todas as operações do mangusto serem concluídas.


0 para resposta № 3

Encerrar o programa do nó diretamente está ocultando os sintomas, não corrigindo o problema!

Finalmente, isolei o problema e descobri que ele estava com as definições de esquema do Mongoose. Se você tentar desligar a conexão muito cedo após a definição dos esquemas do Mongoose1, o aplicativo trava e, eventualmente, produz algum erro estranho relacionado ao MongDB.

Adicionando um pequeno tempo limite antes de executar o program.parse(argv) A linha para executar o aplicativo comandante corrige o problema. Apenas envolva o código da seguinte forma:

var program  = require("commander")
, mongoose = require("mongoose")
, models   = null
;

// Define command line syntax.
program
.command(...)
;

mongoose.connect(
..., // connection parameters.

function() {
// connected to database, defined schemas.
models = require("./models");

// Wait 1 second before running the application code.
setTimeout(function(){
program.parser(process.argv);
}, 1000);
}
);

1: Esta é a minha interpretação inicial, ainda não testei extensivamente essa teoria. No entanto, remover com êxito as definições de esquema do Mongoose impede que o aplicativo seja interrompido.


Na verdade, apenas usando process.nextTick() ao invés de setTimeout() chamada corrige a situação muito bem!