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

Erro por falta de tratamento de evento do mysql

Fiz um pequeno form de login (email e senha) Então se email ou senha incorretos a mensagem deveria aparecer no form da mesma forma que ocorre no produtos/form do curso:

<div class="has-error">
    <%if(errosValidacao){%>
        <%for(var i=0;i<errosValidacao.length;i++){%>
            <%=errosValidacao[i].msg%>
        <%}%>
    <%}%>
</div>

E fiz um route seguindo a ideia do produtos.js do curso:

app.post('/', function(request, response){
        var login = request.body        
        var connection = app.infra.connectionFactory();
        var usuariosDAO = new app.infra.UsuariosDAO(connection);
        usuariosDAO.valida(login, function(erros, resultados){
            if(resultados!=""){
                usuario = resultados;
                response.redirect(usuario, 'principal/painel', erros); 
            }
            else{
                response.status(200).render('login/index', {errosValidacao:[{param:'1065',msg:'email ou senha inválidos', value:''}], login:login});
                connection.end();
                return;
            }                
        });
    });

E criei um UsuariosDAO:

UsuariosDAO.prototype.valida = function(login, callback){
    clausulaSQL = "select * from tb_usuarios where email_usuario = '" + 
        login.email_usuario + "' and pwd_usuario = '" +            login.pwd_usuario + "'" ;
    this._connection.query(clausulaSQL, callback);
}

Quando executo e insiro uma senha incorreta, a mensagem de email ou senha inválidos aparece no form, mas depois de alguns segundos aparece no console um erro:

events.js: 160
    throw er; // Unhandled 'error' event
    ^
Error: Quit inactivity timeout 
    at \node_modules\mysql\lib\protocol\Protocol.js:160:17)
    at emitNone(events.js:86:13)
    at Quit.emit(events.js:185:7)
    at Quit._onTimeout(\node_modules\mysql\lib\protocol\sequences\Sequence.js:126:8)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout(timers.js:198:5)

Esse erro não aparece quando executo o produtos/form do curso então só posso supor que a conexão esteja correta. Parece que mysql espera que eu trate um erro. Mas na verdade a clausula não tem erro, apenas ela não retorna registro nenhum pois não há usuário com aquele email e aquela senha.

5 respostas

Tenta deixar o connection.end(); fora do callback, pode ser?

Fiz o sugerido:

app.post('/', function(request, response){
        var login = request.body        
        var connection = app.infra.connectionFactory();
        var usuariosDAO = new app.infra.UsuariosDAO(connection);
        usuariosDAO.valida(login, function(erros, resultados){
            if(resultados!=""){
                usuario = resultados;
                response.redirect(usuario, 'principal/painel', erros); 
            }
            else{
                response.status(200).render('login/index', {errosValidacao:[{param:'1065',msg:'email ou senha inválidos', value:''}], login:login});
                return;
            }                
        });
        connection.end();                
    });

Mas não mudou o resultado. Continua dando o mesmo erro.

Mais alguma sugestão?

Se eu testar com informacoes corretas a funcao

usuariosDAO.valida(login, function(erros, resultados){
}

UsuariosDAO.prototype.valida = function(login, callback){
    clausulaSQL = "select count(*) as qtde from tb_usuarios where email_usuario = '" + 
        login.email_usuario + "' and pwd_usuario = '" + login.pwd_usuario + "'" ;
    console.log(clausulaSQL);
    this._connection.query(clausulaSQL, callback);
}

retorna resultados: [object object]

Como pego o valor de 'qtde'?

solução!

resultados[0].qtde, dado que só vem um resultado na query. Em relação ao outro erro, não tenho nenhuma sugestão no momento.

A solucao do erro inicial dessa postagem está em

https://cursos.alura.com.br/forum/topico-local-funciona-bem-da-crash-no-heroku-error-quit-inactivity-timeout-22985