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

Node.js and MySql - Error: Cannot enqueue Handshake after invoking quit.

Olá Pessoal,

Recentemente iniciei um projeto com Node.js e por ser ainda um pouco iniciante me deparei com o seguinte problema:

Error: Cannot enqueue Handshake after invoking quit.

Pelo que andei pesquisando no Google identifiquei que isso ocorre porque por causa da criação de pool de conexão sequencial, o sistema não está fechando um para abrir o próximo. Atualmente, estou realizando chamadas de banco utilizando callback. Além dessa maneira, vi que existe uma outra forma que é por meio de Promise. Mas acredito que isso seria apenas maneiras diferentes de se realizar o mesmo processo. Existem os seus pós e contras? Acredito que sim. Mas isso seria uma outra conversa, ou estou enganado!

Bom, abaixo está o código que utilizo:

Controller:

criar() {
  let _model = this.http.req.body;
  if (!_model.id) {
    this.model.obterPorId(_model.id, (err, model) => {
      this.model.criar(_model, (err) => {
        this.redirecionar(model.clienteId);
      });
    });
  }
}

DAO:

obterPorId(id, done) {
  const _sql = `SELECT * FROM Funcionario f WHERE f.Id = ${id}`;
  return this._query.obterUm(_sql, done);
}

criar(model, done) {
  const _sql = `INSERT INTO Funcionario (nome, clienteId, dataCriacao) VALUES ('${model.nome}', ${model.clienteId}, ${this._query.getDataAtual()});`;
  this._query.criar(_sql, done);
}

Query:

executar(sql, done) {
  this._datasource.abrir();
  this._datasource.executar(sql, (err, result) => {
    done(err, result);
  });
  this._datasource.fechar();
}

Datasource:

class Datasource {
  constructor() {
    this._config = app.data.Config;
    this._connection = null;
    this.instanciar();
  }
  instanciar() {
    this._connection = mysql.createConnection(this._config);
  }
  abrir() {
    this._connection.connect();
  }
  executar(sql, done) {
    this._connection.query(sql, (err, result) => {
    if (err) throw err;
      done(null, result);
    });
  }
  fechar() {
    this._connection.end();
  }
}
2 respostas

Fala aí, Diogo! Tudo certo, cara? =)

Eu não manjo de Node, não, mas eu dei uma pesquisada e vi uma resposta que pode ser que funcione. Você poderia testar remover as connection.connect() e connection.close()? Não sei se faz muito sentido, mas foi a resposta como solução nesse tópico...

Espero ter ajudado! =)

Fábio

solução!

Mestre Fábio!

Testei a minha app sem o "connect" e "close" e infelizmente, identifiquei que não estava fechando a conexão, fazendo assim o acumulo de conexões. Bem, isso estava derrubando a minha app quando o mesmo usuário realizava diversas consultas no banco.

Ainda estou em busca de solução, mas agradeço pela força. Quando conseguir resolver volto aqui e posto a solução que encontrar. =)

Obrigado!