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

Error: Cannot enqueue Quit after invoking quit.

Estou tomando o erro "Error: Cannot enqueue Quit after invoking quit." que pelo pesquisei em outro tópico, é causado pelo fluxo assincrono no node que pode estar executando o connection.end(); antes mesmo da conexão ser aberta. Segui a sugestão de encadear o connection.end diretamente no connection.query mas deu certo.

produtos.js

module.exports = function(app) {
    app.get('/produtos', function(req, res) {
        var connection = app.infra.connectionFactory;
        var produtosBanco = new app.infra.ProdutosDAO(connection);
        produtosBanco.lista(function(err, results) {
            console.log(err);
            res.render('produtos/lista', { lista: results });
            connection.end();
        });
    });
};

produtosDAO.js

function ProdutosDAO(connection) {
    this._connection = connection;
};

ProdutosDAO.prototype.lista = function(callback) {
    this._connection.query('select * from livros', callback);
};

module.exports = function() {
    return ProdutosDAO;
};
7 respostas

Olá, Ricardo.

O connection.end() que está dentro da função de callback (chamada de retorno) que você passou pro método lista do produtoBanco não pode ficar dentro desse callback, seu código ficará assim:

Trecho do produto.js

app.get('/produtos', function(req, res) {
  var connection = app.infra.connectionFactory;
  var produtosBanco = new app.infra.ProdutosDAO(connection);

  produtosBanco.lista(function(err, results) {
      console.log(err);
      res.render('produtos/lista', { lista: results });
  });

  connection.end();
});

Marco, joguei o connection.end() pra fora da função de callback e mesmo assim o erro continua

module.exports = function(app) {
    app.get('/produtos', function(req, res) {
        var connection = app.infra.connectionFactory;
        var produtosDAO = new app.infra.ProdutosDAO(connection);
        produtosDAO.lista(function(err, results) {
            console.log(err);
            res.render('produtos/lista', { lista: results });
        });
        connection.end();
    });

Error: Cannot enqueue Quit after invoking quit.
    at Protocol._validateEnqueue (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\protocol\Protocol.js:204:16)
    at Protocol._enqueue (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\protocol\Protocol.js:139:13)
    at Protocol.quit (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\protocol\Protocol.js:92:23)
    at Connection.end (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\Connection.js:249:18)
    at C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\app\routes\produtos.js:9:20
    at Layer.handle [as handle_request] (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\express\lib\router\index.js:281:22
Emitted 'error' event at:
    at Connection._handleProtocolError (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\Connection.js:433:8)
    at Protocol.emit (events.js:182:13)
    at Protocol._delegateError (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\protocol\Protocol.js:392:10)
    at Quit.<anonymous> (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\protocol\Protocol.js:221:10)
    at Quit.emit (events.js:182:13)
    at Quit.Sequence.end (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:12)
    at Quit.end (C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\protocol\sequences\Quit.js:24:28)
    at C:\Users\Guizi\Documents\Cursos\Nodejs\casaDoCodigo\node_modules\mysql\lib\protocol\Protocol.js:225:14
    at process._tickCallback (internal/process/next_tick.js:61:11)

Ricardo.

Por favor, coloca o código do seu connectionFactory.js?

Marco,

Segue o código

var mysql = require('mysql');

function createDBConnection() {
    return mysql.createConnection({
        hots: 'localhost',
        user: 'user-alura',
        password: '',
        database: 'casadocodigo'
    });
};

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

Marco, Removi o "()" do return da function createDBConnection pois entendi que o módulo deve retornar a função não uma chamada dela ( vi esse erro em outro tópico que inclusive foi solucionado por você desta maneira) porém, agora o erro mudou para:

TypeError: this._connection.query is not a function

var mysql = require('mysql');

function createDBConnection() {
    return mysql.createConnection({
        hots: 'localhost',
        user: 'user-alura',
        password: '',
        database: 'casadocodigo'
    });
};

module.exports = function() {
    return createDBConnection;
};
solução!

Marco,

Descobri rs, quando eu dava o comando pra abrir a conexão

var connection = app.infra.connectionFactory

Estava faltando colocar o "()" para que a variavel connection recebesse a instância da connectionFactory, que no caso, cria uma conexão com o DB, ai quando eu passava o connection como argumento na próxima linha

var produtosDAO = new app.infra.ProdutosDAO(connection);

o meu ProdutosDAO não entendia que o connection era uma função que ele iria depois executar a query.

Fiz a alteração e deu certo. Queria só ter certeza que meu entendimento do erro também ficou certo. É isso mesmo?

É isso mesmo, Ricardo :-)