Socket.IO Problem after an active time

0

Hello, first of all I apologize for the code, I am giving maintenance and as soon as I can solve this problem I will work on it better with OO, MVC etc.

My problem is, I'm creating an auction room where everyone in it can bid, it's already working, but after a few minutes or if you go out and enter the room the server simply stops, and does not display any error messages , which is making it difficult to search for a solution, at first I realized that the clients were not disconnecting, so sometimes a customer entered the room and counted 5 entries. now I have not noticed this problem, but the socket goes online but does not receive any emit, nor does it work consoles.log. (I'm running on a MAC and UBUNTU, I installed forever to keep active and nodemon)

const app       = require('express')();
const http      = require('http').createServer(app);
const io        = require('socket.io')(http);
const port      = 3005;
var users = 0;
var pool = require('./config/pool-factory.js');

app.get('/leilao', (req, res) => {
 res.sendFile(__dirname+'/client.html');
});

io.on('connect',(socket) => {

var userName = false;
var userID = false;
var room = false;
var valor_minimo = false;
var valor_atual = false;
var lance_minimo = false;
var data_inicio = false;
var data_fim_previsto = false;
var fim_leilao = false;
var inicio_leilao = false;
var data_fim_efetivo = false;
var sala_leilao = false;
var token = false;

//Avisa sobre o fim do leilão
function bidEnd(){

    console.log("bidEnd");

    pool.getConnection((err, connection)=>{

        if (err) console.log(err);

        var detalhes = "select format(valor,2,'de_DE') as lance_formatado, nome_usuario, id_usuario from cad_lances inner join sala_leilao on fk_sala_leilao = id_sala_leilao inner join seg_usuarios on id_usuario = fk_usuario where fk_leilao = "+room+" order by valor desc limit 1"; //buscaR dados do leilão e da sala
        //console.log(detalhes);

        connection.query(detalhes, (err, data)=>{ // carrega variaveis com dados vindos da busca

            if (err) console.log(err.sqlMessage)
            else {
                //console.log(data);

                if(data.length > 0){

                    var arrematado = data[0].nome_usuario+' deu o lance de R$ '+data[0].lance_formatado+" e arrematou o leilão!";

                    io.sockets.in(room).emit('newBid', arrematado); //informa o lance vencedor

                    if(data[0].id_usuario == userID){
                        socket.emit('winner', "Parabéns você arrematou o produto"); //informa os últimos 5 lances
                        //console.log('id = '+data[0].id_usuario+' socket id = '+userID);
                    } else {
                        socket.emit('winner', arrematado);  //informa os últimos 5 lances
                    }                                       


                }               

            }
        })
            .on('end', function() {

                //socket.disconnect();
                console.log("bidEnd - end");

        });

    });

}

function ultimosLances() {

    console.log("últimos lances");

    pool.getConnection((err, connection)=>{

    var calcLance = "select format(valor,2,'de_DE') as lance_formatado, nome_usuario from cad_lances inner join sala_leilao on fk_sala_leilao = id_sala_leilao inner join seg_usuarios on id_usuario = fk_usuario where fk_leilao = "+room+" order by valor desc limit 5"; //busca dados do leilão e da sala

    //console.log(calcLance);

        connection.query(calcLance, (err, data)=>{ // carrega variaveis com dados vindos da busca

            if (err) console.log(err.sqlMessage)
            else {
                //console.log(data);

                if(data.length > 0){

                    for (var i = data.length - 1; i >= 0; i--) {

                        socket.emit('newBid', data[i].nome_usuario+' deu o lance de R$ '+data[i].lance_formatado);  //informa os últimos 5 lances
                        //console.log(data[i].nome_usuario+' deu o lance de R$ '+data[i].lance_formatado);
                    }

                }

                //console.log("últimos lances enviados");

            }
        })
        .on('end', function() {

            // se tentar conectar antes do horario de inicio desconecta cliente
            // se não vieram dados na busca desconecta cliente
            if (!room || inicio_leilao > 0 || fim_leilao <= 0) { 

                if(fim_leilao <= 0){
                    console.log("Deveria chamar o bidEND");
                    //bidEnd(); 
                }

            }

            console.log("últimos lances END");


        });

    });

}

function startRoom(){

    console.log("startRoom");
    console.log(users+" usuários na room "+room+ " Usuário: "+ userName+' entrou no leilão')

    socket.join(room);
    io.sockets.in(room).emit('newUser',     userName+' entrou no leilão');  //informa para todos usuários que usuário entrou
    //console.log(userName+' entrou no leilão, valor atual: '+valor_atual);
    socket.emit('currentBid',   valor_atual);   //informa para o novo usuário o lance mínimo atual
    socket.emit('dateStart',    inicio_leilao); //informa para o novo usuário o tempo que falta para inicio do leilão
    socket.emit('dateEnd',      fim_leilao);    //informa para o novo usuário o tempo que falta para o fim do leilão

    console.log("startRoom END");

}

socket.on('joinRoom', (token_acesso,id_leilao)=>{ 

    if(id_leilao != null && id_leilao != "" 
        && token_acesso != null && token_acesso != ""){

        var query = "SELECT id_sala_leilao, id_usuario, nome_usuario, id_leilao, valor_minimo, format(valor_atual,2,'de_DE') valor_atual, lance_minimo, data_inicio, data_fim_previsto, token_acesso, timestampdiff(SECOND, current_timestamp, data_inicio) as inicio, fim FROM view_usuario_leilao WHERE token_acesso = '"+token_acesso+"' and id_leilao = "+id_leilao; //busca dados do leilão e da sala

        //console.log(query);

        pool.getConnection((err, connection)=>{

            if (err) console.log(err);

            connection.query(query, (err, data)=>{ // carrega variaveis com dados vindos da busca

                    if (err) console.log(err.sqlMessage)
                    else {
                        //console.log(data);

                        if(data.length > 0){

                            users++;
                            sala_leilao       = data[0].id_sala_leilao;
                            userName          = data[0].nome_usuario;
                            room              = data[0].id_leilao;
                            valor_minimo      = data[0].valor_minimo;
                            valor_atual       = data[0].valor_atual;
                            lance_minimo      = data[0].lance_minimo;
                            data_inicio       = data[0].data_inicio;
                            data_fim_previsto = data[0].data_fim_previsto;
                            userID            = data[0].id_usuario;

                            inicio_leilao     = data[0].inicio;
                            fim_leilao        = data[0].fim;

                            token = token_acesso;

                        }

                    }

                })
                    .on('end', function() {

                        connection.release();

                        if(userName){
                            startRoom();
                            ultimosLances();
                            console.log('token recebido: '+token_acesso+" usuário "+userName+' id_leilao: '+id_leilao);
                        } else {
                            console.log(token_acesso+" Não irá conectar");
                        }





                })
        });

    }

});

socket.on('bid', ()=>{

    var lance;
    var lance_formatado;

        pool.getConnection((err, connection)=>{

            if (err) console.log(err);

            connection.beginTransaction((err)=>{

                var calcLance = "select ifnull(format((max(valor) + "+lance_minimo+"),2,'de_DE'),("+valor_minimo+" + "+lance_minimo+")) as lance_formatado, ifnull((max(valor) + "+lance_minimo+"),("+valor_minimo+" + "+lance_minimo+")) as lance from cad_lances inner join sala_leilao on fk_sala_leilao = id_sala_leilao where fk_leilao = "+room+" limit 1"; //busca dados do leilão e da sala

                //console.log(calcLance);

                connection.query(calcLance, (err, data)=>{ // carrega variaveis com dados vindos da busca

                    if (err) console.log(err.sqlMessage)
                    else {
                        //console.log(data);

                        if(data.length > 0){

                            lance           = data[0].lance;
                            lance_formatado = data[0].lance_formatado;

                        } else {
                            lance           = valor_atual;
                            lance_formatado = valor_atual;
                        }

                    }
                })
                    .on('end', function() {

                        var query = 'INSERT INTO cad_lances (valor, data_lance, fk_sala_leilao) VALUES (?, current_timestamp, ?)';

                        connection.query(query, [lance, sala_leilao], (err, result)=>{

                            if (err) {
                                //console.log(err.sqlMessage);
                                //console.log(err.sql);
                                connection.rollback();

                            } else {
                                //console.log('INSERT LANCE OK');
                            }
                        })

                    });


                // var query = 'UPDATE cad_leilao SET valor_atual = ? WHERE id_leilao = ?';

                // connection.query(query, [lance, room], (err, result)=>{

                //  if (err) {
                //      //console.log(err.sqlMessage);
                //      //console.log(err.sql);
                //      connection.rollback();

                //  } else {
                //      //console.log('UPDATE OK');
                //  }
                // })

                var query = 'SELECT valor_atual, data_fim_previsto, fim FROM view_usuario_leilao WHERE token_acesso = '+token; //busca dados do leilão e da sala

                connection.query(query, (err, data)=>{ // carrega variaveis com dados vindos da busca

                    if (err) {

                        //console.log(err.sqlMessage);
                        //console.log(err.sql);
                        connection.rollback();

                    } else {
                        //console.log('SELECT OK');

                        valor_atual       = data[0].valor_atual;
                        data_fim_previsto = data[0].data_fim_previsto;
                        fim_leilao        = data[0].fim;

                    }
                })

                .on('end', function() {

                    if (fim_leilao <= 50 && fim_leilao > 0) {

                        var query = "UPDATE cad_leilao SET data_fim_previsto = ADDTIME(CURRENT_TIMESTAMP, '00:00:50') WHERE id_leilao = ?";
                        fim_leilao = 50;

                        //console.log("-----------"+query+" Sala "+room+" usuario "+userName);

                        connection.query(query, [room], (err, result)=>{

                            if (err) {
                                //console.log(err.sqlMessage);
                                //console.log(err.sql);
                                connection.rollback();

                            } else {
                                console.log("Aumentar 50 Segundos");
                                socket.emit('dateEnd',  fim_leilao);
                                //console.log('########## UPDATE 2 OK'+fim_leilao);
                            }

                        })

                    } else {
                        console.log('Tempo restante '+fim_leilao);
                    }
                })

                connection.commit(function(err){
                    if (err){
                        connection.rollback();

                    } else {

                        var lance_dado = userName+' deu o lance de R$ '+lance_formatado;

                        console.log(lance_dado)
                        io.sockets.in(room).emit('currentBid',  lance_formatado);   //informa para todos usuários novo lance minimo
                        io.sockets.in(room).emit('newBid',      lance_dado);    //informa o último lance para todos da sala
                    }
                })
            })

            connection.release();
        })

});

socket.on('disconnect', function(){
    if(userName){
        socket.disconnect();
        console.log(userName+' saiu');
        users--;
        console.log(users+" usuários na room "+room)
    }
});

}); // io.on('connection') - FIM

http.listen(port, function(){
  console.log('Listening on port '+port)
});
    
asked by anonymous 14.06.2018 / 03:25

0 answers