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

Enfileiramento de Querys

Bom dia Pessoal!

estou apreendendo node.js agora, realizei os cursos e resolvi iniciar um pequeno projeto para estudo.

A ideia do projeto é criar um logon simples, que quando o usuario fizer logon preciso adicionar um registro como se fosse um token na tabela dele.

Eu chamo o metodo de logon, até ai funciona bacana, mas quando chamo dentro deste metodo a parte para gerar o token e dar o update dá o erro abaixo:

{ Error: Cannot enqueue Query after invoking quit.
    at Protocol._validateEnqueue (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\node_modules\mysql\lib\protocol\Protocol.js:203:16)
    at Protocol._enqueue (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\node_modules\mysql\lib\protocol\Protocol.js:138:13)
    at Connection.query (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\node_modules\mysql\lib\Connection.js:200:25)
    at userDao.newUkey (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\class\userDao.js:20:20)
    at Query.<anonymous> (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\controllers\user.js:46:25)
    at Query.<anonymous> (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\node_modules\mysql\lib\Connection.js:502:10)
    at Query._callback (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\node_modules\mysql\lib\Connection.js:468:16)
    at Query.Sequence.end (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
    at Query._handleFinalResultPacket (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\node_modules\mysql\lib\protocol\sequences\Query.js:139:8)
    at Query.EofPacket (C:\Users\epinheiro\Desktop\EDUARDO\IoT PROJECT\SISTEMA\SIS_NODEJS\node_modules\mysql\lib\protocol\sequences\Query.js:123:8) code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }

O codigo que estou utilizando é o codigo abaixo, veja que chamo o metodo logon, e dentro do callback desse metodo chamo o metodo para gerar esse token (newUkey).

  userDao.logon(user,function(exception,results,fields){
          if(!exception) {              
              if (results.length>0){
                console.log(results);
                userDao.newUkey(results,function(exception,result){
                  console.log('Ukey gerada!');
                  res.redirect("/produtos");
                });


              }else{
                console.log('Dados de logon não encontrado!');
                res.send('Dados não encontrado');
              }
          }else{
            res.send('Erro : ' + exception);
          }
      });
3 respostas
solução!

Pessoal, descobri o erro mas não entendi a solução. No final eu tinha um comando

connection.end();

Porém esse comando estava fora do userDao.logon()

Precisaria de um pouco mais do seu codigo pra tirar algo conclusivo. Porem me parece que aonde é executado o update do banco é assíncrono, ou seja, apesar de na estrutura do arquivo o end vir depois o update é executado após o fechamento da conexao.

Suponho que o seu código esteja mais ou menos assim:

userDAO.logon( ... );
...
connection.end();

Se nao me engano as operacoes feitas no banco da microsoft usando o mssql utilizava funcoes async.

Quase certo que seja este o problema. Tirando o connection.end() pode "resolver", porem pode dar problemas futuros com varias conexoes abertas no banco.

Hiroshi,

Se coloco o connection.end() no final dá erro, se coloco no meio dá erro tb,rs

Hoje meu codigo está assim sem o connectio.end()

Arquivo: user.js

app.post("/user/logon",function(req,res) {
      var user = req.body;
      var log = new app.class.log();

      //valida o preenchimento
      req.assert('email','E-mail deve ser preenchido').isEmail();
      req.assert('senha','Senha deve ser preenchida').notEmpty();

      //verifica se deu algum erro
      var errors = req.validationErrors();
      if(errors){
          log.log(errors); //imprimo os erros na console
          res.format({
              html: function(){ //se o formato de saida for HTML saio como HTML
                  console.log('Formato Solicitado > HTML');
                  //res.status(400).render("produtos/form",{validationErrors:errors,user:user});
                  res.status(400).send('HTML');
              },
              json: function(){ //se formato de saida for JSON sai como JSON
                  console.log('Formato Solicitado > JSON');
                  res.status(400).send(errors);
              }
          });
          return ;
      }

      //caso nao tenha dado erro faço login
      var connection = app.infra.connectionFactory();
      var userDao = new app.class.userDao(connection);

      //chama a funcao de logon
      userDao.logon(user, function(result){
          if (result.status == 'success'){ //se o logon for sucesso
            res.format({ //vejo se pediu para sair como HTML
                html: function(){ //sai como HTML
                    log.success('REQUEST:::> /user/logon','HTML');
                    //res.status(200).render("produtos/form",{validationErrors:errors,user:user});
                    res.status(200).send('HTML');
                },
                json: function(){ //sai como JSON
                    log.success('REQUEST:::> /user/logon','JSON');
                    res.status(200).send(result);
                }
            });
          }else{
            //caso deu algum erro no logon, saio com o erro conforme formato solicitado.
            res.format({
                html: function(){
                    log.error('REQUEST:::> /user/logon',result.msg);
                    //res.status(200).render("produtos/form",{validationErrors:errors,user:user});
                    res.status(200).send('HTML');
                },
                json: function(){
                    log.error('REQUEST:::> /user/logon',result.msg);
                    res.status(200).send(result);
                }
            });
          }
      });

  });

E o arquivo: userDao.js

userDao.prototype.logon = function(user,callback) {
    this._connection.query('SELECT * FROM users WHERE email = ? and senha = ?',
                            [user.email, user.senha],
                            function(exception,results,fields){

                              if(!exception) {
                                  if (results.length>0){
                                      var user = JSON.parse(JSON.stringify(results))[0];
                                      var criptoValue = new Date() + user.email + user.idUser + user.uKey;
                                      var uKey = crypto.createHash('sha512').update(criptoValue).digest('base64');
                                      user.uKey = uKey;

                                      var retorno = {
                                          code:0,
                                          status: 'success',
                                          msg : 'Usuario Logado com sucesso',
                                          user: user
                                      };

                                      this._connection.query('UPDATE users SET uKey = ? where idUser = ?', [uKey, user.idUser],  callback(retorno) );
                                  }else{
                                      var retorno = {
                                          code:999, status: 'error',msg : 'Usuário ou Senha Invalidos'
                                      };
                                      callback(retorno);
                                  }
                              }else{
                                  var retorno = {
                                      code:999, status: 'error', msg : exception
                                  };
                                  callback(retorno);
                              }
                            });
}