1
resposta

Erro ao fechar conexão ao encadear query().end()

Boa tarde! Eu estou tendo um problema durante a consulta no banco de dados. Abri um tópico hoje sobre o tema e a dúvida foi respondida, porém outro erro apareceu oriundo da solução proposta. O post que abri com a dúvida é esse: https://cursos.alura.com.br/forum/topico-error-cannot-enqueue-quit-after-invoking-quit-51325#642135

Ao realizar o fechamento da conexão conforme indicado, me parece que a lista que vêm da base não está carregando pois parece que o objeto contendo os registros está undefined (pois não consigo acessar a propriedade length)

Segue implementação após o primeiro tópico aberto:

/**
 * @author bruno.carneiro
 * @param {*} app 
 */
module.exports = function(app) {

    // Objeto de conexão com a base de dados
    var conn = app.infra.connectionFactory();

    // Rota para listagem de produtos
    app.get('/produtos/lista', function(req, res) {

        // Executando consulta
        conn.query('select * from produtos', function(err, results) {
            res.render('produtos/lista', {
                lista : results
            });
        }).end(); // Agora estou encadeando a função end() para não ter problema com a assincronicidade...

    });
}

O que parece é que a rota é carregada normalmente e que o parâmetro results é atribuído para a variável lista corretamente, porém results parece estar undefined

ERRO:

Server listening on http://localhost:3000 ...
TypeError: C:\Users\brunocarneiro\Documents\desenvolvimento\estudo\back-end\nodejs\alura\app\views\produtos\lista.ejs:11

    9|         </thead>
    10|         <tbody>
 >> 11|             <% for(var i=0; i < lista.length; i++) { %>
    12|             <tr>
    13|                 <td><%= lista[i].id; %></td>
    14|                 <td><%= lista[i].nome %></td>

Cannot read property 'length' of undefined

Eu tentei também a seguinte abordagem:

/**
 * @author bruno.carneiro
 * @param {*} app 
 */
module.exports = function(app) {

    // Objeto de conexão com a base de dados
    var conn = app.infra.connectionFactory();

    // Rota para listagem de produtos
    app.get('/produtos/lista', function(req, res) {

        // Executando consulta
        conn.query('select * from produtos', function(err, results) {
            res.render('produtos/lista', {
                lista : results
            });
            conn.end(); // Fechando a conexão dentro do callback e depois do render. Consulta a primeira vez, mas dá erro se der reload na página.
        });

    });
}

ERRO:

Server listening on http://localhost:3000 ...
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: Cannot enqueue Quit after invoking quit.

Alguém pode me ajudar? :)

1 resposta

Oi Bruno, tudo bem? Você verificou se o results antes de ser retornado para a view, está de fato trazendo algum resultado? O primeiro parâmetro no callback é uma variável que deve apontar algum erro na consulta ao banco de dados. Caso haja erros na consulta, o esperado é que o results seja undefined, ao meu ver pelo menos.