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)
});