Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Problemas com connection.end - Cannot enqueue Quit after invoking quit

Terminei a terceira aula do curso e minha aplicação já está listando, cadastrando e excluindo produtos. Porém, tenho problemas quando eu coloco o connection.end(); no final da função que controla a rota que lista os produtos (igual ao exemplo do professor).

Com esta parte do código está ativa, a lista de produtos só abre uma única vez, quando eu executo a ação de exclusão que redireciona para a lista de produtos, recebo o seguinte erro no console do node:

events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: Cannot enqueue Quit after invoking quit.

O mesmo problema ocorre quando eu recarrego a lista de produtos após ela carregar a primeira vez.

Meu código:

module.exports = function(app){

    app.get("/produtos",function(request,response){
        console.log("abrindo lista de produtos");

        var connection = app.infra.connectionFactory; //o express-load disponibiliza o objeto desta forma apos carrega-lo
        var produtosDAO = new app.infra.ProdutosDAO(connection); 

        produtosDAO.lista(function(err, results){
            response.render('produtos/lista', {lista: results});
        });

        connection.end();

    });

    app.get("/produtos/form",function(request,response){
        console.log('abrindo formulario de cadastro de produtos');
        response.render('produtos/form');
    });

    /*  
    ..
    outras rotas
    ..
     */
}
8 respostas

Olá, Rafael.

Você pode colocar o código do seu arquivo connectionFactory.js?

Olá Marco

Segue o código:

var mysql = require("mysql");

function createDBConnection(){
    return mysql.createConnection({
            host:'w7bdvm',
            user:'root',
            password:'1234',
            database:'casadocodigo_nodejs'
        });
}

module.exports = function(){
    return createDBConnection();
}

Você deve exportar a função para abrir uma conexão e não a conexão aberta.

module.exports = function(){
    return createDBConnection;
}

Aqui você abre uma nova conexão.

var connection = app.infra.connectionFactory();

Motivo: O NodeJS meio que carrega em cache os módulos, então se você exporta a conexão aberta, ela vai ser única pra todo o servidor. Quando você fecha ela, ela não é aberta novamente ao importar o módulo com app.infra.connectionFactory e sim retornada a mesma conexão de antes.

Boa tarde Ícaro.

Desculpe, mas não entendi sua explicação. O código que você sugeriu parece igual ao que eu postei.

Obrigado.

Alguém consegue me ajudar?

solução!

Olá, Rafael. Desculpa pela demora.

A solução é o código que o Ícaro postou.

No seu código dentro no return da função do module.exports, você está executando a função createDBConnection(). Já no código do Ícaro ele não executa a função createDBConnection. Essa é a diferença do seu código para o do Ícaro.

Por favor, retire os parênteses que vem depois da função para você retorno a a função em vez da execução da mesma.

Obrigado senhores.

Resolveu o problema e consegui entender o conceito.

Boa Rafael. Fico feliz em tem conseguido te ajudar.