[RESOLVIDO] Site em Real-time com Node.JS

Fala pessoal, alguém pode me ajudar nessa…

Desenvolvi um site totalmente dinâmico com banco de dados MySQL, ou seja, todos os principais elementos da página principal estão vindo do banco de dados, faço isso utilizando Node.JS, Express e MySQL.

Problema que após alterar algo no banco de dados, mesmo eu atualizando a página (F5) as informações da página não mudam. A mudança só refelete na página seu eu reiniciar o serviço “nodemon app.js” pelo CMD.

Já pesquisei bastante sobre o assunto e cheguei no Socket.io, até consegui iniciar ele aqui na minha aplicação mas não estou conseguindo empregar ele na atualização das consultas ao MySQL.

Vejam os principais trechos da estrutura do meu código relacionados a este tema, por favor, me ajudem:

Trecho do arquivo app.js

const express = require('express');
var http = require('http');
var socket = require('socket.io');

var app = express();
var http = http.Server(app);
var io = socket(http);

var port = 3000;
io.on('connection', function (io) {
http.listen(port, () => {
    console.log('Em execução');
    console.log('Endereço do site : localhost:', port);
});

//Aqui está minha rota onde faço as consultas
const rotas = require('./routes/rotas')(io);
app.use('/', rotas);

Até aqui tudo ok.

Vamos agora para o arquivo da rota:
Trecho do arquivo rotas.js

module.exports = (io) => {//Aqui recebo o socket.io lá do app.js

var express = require('express');
var rotas = express.Router();

const { pageSite } = require('../controller/site/site.js'(io); //Aqui passo o socket.io para o site.js
rotas.get('/', pageSite); //localhost:3000 (rota da página principal)

return rotas;
};

Até aqui tudo ok.

Vamos agora para o arquivo que faz o render da página principal do site:
Trecho do arquivo site.js

//Aqui importo o site-model onde tem minhas consultas SQL
const funcao = require('./site-model');

//Aqui pego o resultado da consulta e gravo na variável section1
let section1;
(async function () {
   section1 = JSON.parse(JSON.stringify(await funcao.getSection1_Title));
})()

//Aqui passo os dados da variável section1 como parâmetro para o render da página
module.exports = (io) => {
   return {
      pageSite: (req, res, next) => {
         res.render('./site/index', {
             DTSection1: section1
         });
      },
   };
}

Até aqui tudo ok.

Vamos agora para o arquivo que faz o render da página principal do site:
Trecho do arquivo site-model.js

//Função para consuoltar no banco
function select(query) {
    return new Promise((resolve, reject) => {
        conn.query(query, function (err, rows, fields) {
            if (err) return reject(err)
            resolve(rows);
        });
    });
}

module.exports = {
getSection1: (async function () {
        const result = await select('SELECT * FROM tb_section1 ORDER BY cod DESC');
        return result;
    })(),
}

Até aqui tudo ok.

Esta tudo funcionando perfeitamente, sempre que atualizo algo no BD ele reflete na página desde que eu reinicie o serviço node no CMD.

AJUDA: Só que preciso que os dados se atualizem na página quando eu der “F5” na página.

Penso que ao ao atualizar a página o socket.io deveria reprocessar a consulta ao BD regravando o retorno novo na variável “section1” do arquivo site.js, mas como fazer isso?

Observação, já fiz todos os testes, meu socket.io está instalado e funcionando perfeitamente, meu problema é só essa questão de reprocessar a consulta quando o usuário dar um refresh na página.

Galera, não sei se foi a melhor forma de resolver, mas está funcionando kkkkk

Joguei uma consulta dentro do pageSite: antes do render, desta forma ao iniciar o servidor ele grava o resultado na variável e, após 2 F5 ele atualiza os dados na tela, não me perguntem como cheguei nisso ai, não sei nem explicar, mas está funcionando perfeitamente.

Trecho do arquivo ** site.js** onde acrescentei a solução:

//Aqui importo o site-model onde tem minhas consultas SQL
const funcao = require('./site-model');

//Aqui pego o resultado da consulta e gravo na variável section1
let section1;
(async function () {
   section1 = JSON.parse(JSON.stringify(await funcao.getSection1_Title));
})()

//Aqui passo os dados da variável section1 como parâmetro para o render da página
module.exports = (io) => {
   return {
      pageSite: (req, res, next) => {

      //Esse trecho aqui foi a solução 
      conn.query('SELECT * FROM section_1_title ORDER BY cod DESC LIMIT 1', function (err, rows, fields) {
        if (err) throw err;
        section1 = JSON.parse(JSON.stringify(rows));//Aqui regrava a nova consulta
      });//fim solução

   //Aqui renderiza a página
   res.render('./site/index', {
             DTSection1: section1
         });
      },
   };
}

Da uma olhada no código. Você tem alguma promise que não está sendo resolvida. Em alguma parte do seu código que acessa os dados e deveria retirar.