Help! Consulta no MySQL com outra consulta dentro.

166 views
Skip to first unread message

Eduardo Chiaradia

unread,
Jun 28, 2019, 3:00:29 PM6/28/19
to Node.js Brasil
Boa Tarde Amigos!

estou com um pequeno problema, que está tirando meu sono..rs

Tenho um objeto que ele faz uma consulta no banco MySQL localizando um CNPJ de um cliente, caso ele não encontre ele cadastra esse cliente, se encontrar ele retorna o cliente.

Estou utilizando promisses, veja abaixo como está meu codigo, quando chamo o metodo addCliente eu chamo automaticamente o metodo findClienteByCNPJ, marco em vermelho a linha que está gerando o problema.


iPedidos.prototype.addCliente = async function(cliente){
console.log(`Localizando cliente com CNPJ: ${cliente.cnpj}`);
var idCliente = await this.findClienteByCNPJ(cliente);
if ( idCliente != 0 ){
console.log(`Cliente Encontrado!`);
return idCliente;
}
console.log(`Cliente NAO Encontrado, iniciando adição do cliente`);
var conexao = this._connection;
query = `INSERT INTO epx_ipedidos_clientes SET ?`;
idCliente = await new Promise(function(resolve,reject){
conexao.query(query, cliente,
function(exception,results){
if(!exception) {
console.log("Adicionou");
resolve(results.insertId);
}else{
console.log(exception);
resolve(0);
}
});
}).then( function(id){ return id; }) //executa quando der certo
.catch(function(err){ console.log("Erro : " + err); return false; } ); //executa quando der erro
return idCliente;

}

Meu metodo findClienteByCNPJ segue abaixo:
iPedidos.prototype.findClienteByCNPJ = async function(cliente){
var conexao = this._connection;
var idepx_ipedidos_clientes = await new Promise(function(resolve,reject){
var query = `SELECT * FROM epx_ipedidos_clientes WHERE CNPJ='${cliente.cnpj}'`;
conexao.query(query,
function(exception,results,fields){
if(!exception) {
if (results.length>0){
var results = JSON.parse(JSON.stringify(results))[0];
resolve(results.idepx_ipedidos_clientes);
}else{
resolve(0);
}
}else{
console.log("Erro ao tentar localizar o cliente pelo CNPJ!");
resolve(0);
}
});
}).then( function(status){ return status; })
.catch( function(err){ console.log("Erro : " + err); return false; } );
return idepx_ipedidos_clientes;
}



E o erro apresentado é o erro abaixo:

Iniciando processo para adicionar os pedidos
Localizando cliente com CNPJ: 08.944.948/0001-07
Cliente NAO Encontrado, iniciando adição do cliente
{ Error: Cannot enqueue Query after invoking quit.
    at Protocol._validateEnqueue (C:\Users\epinheiro\Desktop\EDUARDO\EPUX_CONSOLE\node_modules\mysql\lib\protocol\Protocol.js:203:16)
    at Protocol._enqueue (C:\Users\epinheiro\Desktop\EDUARDO\EPUX_CONSOLE\node_modules\mysql\lib\protocol\Protocol.js:138:13)
    at Connection.query (C:\Users\epinheiro\Desktop\EDUARDO\EPUX_CONSOLE\node_modules\mysql\lib\Connection.js:200:25)
    at idCliente (C:\Users\epinheiro\Desktop\EDUARDO\EPUX_CONSOLE\class\iPedidos.js:175:13)
    at new Promise (<anonymous>)
    at iPedidos.addCliente (C:\Users\epinheiro\Desktop\EDUARDO\EPUX_CONSOLE\class\iPedidos.js:174:21)
    at process._tickCallback (internal/process/next_tick.js:68:7) code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }
 
 

Bruno Kuhlmann Cechet

unread,
Jun 28, 2019, 3:16:57 PM6/28/19
to Node.js Brasil


Bruno Cechet / Desenvolvedor Web 
bruno...@gmail.com / (47) 9 9925-3523

BlumenauSanta Catarina 

Facebook  LinkedIn  Skype  Github  Soundcloud 



--
Você recebeu essa mensagem porque está inscrito no grupo "Node.js Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nodebr+un...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/nodebr/696d173d-9b68-4b91-aad2-b55328355130%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Eduardo Chiaradia

unread,
Jun 28, 2019, 4:01:33 PM6/28/19
to Node.js Brasil
Bruno,

obrigado pela resposta mas meu caso acho que é um pouco diferente.
Pois eu não estou fechando a conexão, pois tenho que mante-la aberta para outras consultas.
Eu já tentei fechando ou não a conexão e o problema persiste.

O que acabei fazendo e funcionou foi criar a conexão na segunda consulta novamente, porém acho que não seja uma boa saída.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nod...@googlegroups.com.

Bruno Kuhlmann Cechet

unread,
Jun 28, 2019, 5:12:15 PM6/28/19
to Node.js Brasil
Eduardo,

De uma olhada na documentação da lib que você está usando: https://github.com/mysqljs/mysql#connection-options
Sugiro voce criar uma conexão com os seguintes atributos:
debug: true
multipleStatements: true

Uma opção interessante seria tentar trabalhar com um pool de conexões:
https://github.com/mysqljs/mysql#pooling-connections

No mais, de uma olhada no repositório. Veja o código da lib aonde está acusando o erro pelo stack trace. 
De uma olhada na pasta de testes também, pode te dar um insight sobre o que ta acontecendo.



Bruno Cechet / Desenvolvedor Web 
bruno...@gmail.com / (47) 9 9925-3523

BlumenauSanta Catarina 

Facebook  LinkedIn  Skype  Github  Soundcloud 


Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para nodebr+un...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/nodebr/4695a446-e8af-450a-8101-a546032e320a%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages