1
resposta

[Dúvida] Hospedagem Projeto React

Olá boa tarde

Estou com um projeto react com frontend e backend e dados gravados no mysql apache, como faço para publicar um provedor gratuito? Tentei publicar nesse https://cp1.atspace.me/ não consigo só consigo publicar frontend. Fiz o arquivo .env REACT_APP_API_URL=projetofullstack.atspace.cc mais mesmo assim não funcionou. Código para conferir

Login.js

import connection from "../connection/Conexao.js";
import bcrypt from "bcrypt"

export const Login = ("/login", (req, res) => {
    const { email, senha } = req.body; 
    const query = "SELECT * FROM usuarios WHERE email = ?";
    connection.query(query, [email], async (err, results) => {
        if(err) {
            console.error("Erro ao se logar", err);
            res.status(500).json("Erro interno do servidor");
            return;
        }
        
        if (results.length > 0) {
            const user = results[0];
            const passwordMatch = await bcrypt.compare(senha, user.senha);
            if (passwordMatch) {
                req.session.userId = user.id; // Armazena o ID do usuário na sessão
                res.status(200).json("Usuário logado com sucesso!!!");
         	} else {
                res.status(401).json("Email ou senha incorretos");
            }
        } else {
            res.status(401).json("Email ou senha incorretos");
        }
        
    });
});

// Rota para obter dados do usuário
export const Logar = ('/user', (req, res) => {
  if (!req.session.userId) {
    return res.status(401).json('Usuário não autenticado');
  }
  const query = "SELECT * FROM usuarios WHERE id = ?";
  connection.query(query, [req.session.userId], (err, results) => {
      if(err) {
          console.error("Erro ao buscar dados do usuário", err);
          return res.status(500).json("Erro interno do servidor");
      }
      if(results.length > 0) {
          res.json(results[0]);
      } else {
          res.status(404).json("Usuário não encontrado");
      }
  })
});

export const Logout = ("/logout", (req, res) => {
    req.session.destroy(err => {
        if(err) {
            console.error("Erro ao fazer logout");
            res.status(500).json("Erro interno do servidor");
            return;
        }
        res.status(200).json("Usuário deslogado com sucesso!!!");
    });
});

export const RedefinirSenha = ('/redefinirsenha/:email', (req, res) => {
    const email = req.params.email;
    const query = "SELECT * FROM usuarios WHERE email = ?";
    
    connection.query(query, [email], (err, results) => {
        if(err) throw err;
        if(results.length > 0) {
            res.json({ userEmail: results[0].email });
        } else {
            res.status(404).json("Usuário não encontrado");
        }
    })			
});

// Função para executar consultas SQL retornar uma promessa
const query = (sql, params) => {
    return new Promise((resolve, reject) => {
        connection.query(sql, params, (error, results) => {
            if(error) {
                return reject(error);
            }
            resolve(results);
        })
    })
}

// Implementação da função AtualizarSenha
export const AtualizarSenha = ('/atualizarsenha/:email', async (req, res) => {
    try {
        const {email} = req.params; // Obtém o email dos parâmetros da URL
        const { novaSenha } = req.body; // Obtém a nova senha do corpo da requisição
    
        console.log('Dados recebidos no contralador:', { email, novaSenha });
        
        if(!email || !novaSenha) {
            console.log('Erro: Email ou nova senha ausentes');
            return res.status(400).json({ error: 'Email e nova senha são necessários' });
        }
        
        const result = await query('SELECT * FROM usuarios WHERE email = ?', [email]);
        
        console.log('Resultado da consulta:', result);
        
        if(result.length === 0) {
            console.log('Erro: Usuário não encontrado');
            return res.status(404).json({ error: 'Usuário não encontrado' });
        }
        
        const hashedSenha = await bcrypt.hash(novaSenha, 10);
        
        await query('UPDATE usuarios SET senha = ? WHERE email = ?', [hashedSenha, email]);
        
        res.status(200).json({ message: 'Senha atualizada com sucesso!' });
    } catch(error) {
        console.log('Erro ao atualizar a senha:', error); // Detalhe o erro para depuração
        res.status(500).json({ error: 'Erro ao atualizar a senha' });
    }
});

conexao.js

import mysql from 'mysql';

const connection = mysql.createConnection({
    host: 'fdb1033.atspace.me',
    user: '	3883300_autenticacao',
    password: '',
    database: '3883300_autenticacao'
});

connection.connect(erro => {
    if(erro) {
        console.error('Erro de conexão', erro);
        return;
    }
    console.log('Conexão realizada com sucesso com banco de dados!!!');
});

export default connection;

da esse erro Login.js:28

 POST http://projetofullstack.atspace.cc/undefined/login 404 (Not Found)
Login.js:36 Error response: 
{data: '<html><head><meta http-equiv="refresh" content="0;…ace.com/error-404/" /></head><body></body></html>', status: 404, statusText: 'Not Found', headers: qt, config: {…}, …}


Aguardo resposta Att: Cezar Maruca

1 resposta

Olá Cezar, tudo bem?

Publicar um projeto fullstack (frontend, backend e banco de dados) em um provedor gratuito pode ser um pouco desafiador, pois muitos provedores gratuitos oferecem apenas suporte para hospedagem de sites estáticos (apenas frontend). No entanto, vou te orientar sobre algumas alternativas que podem te ajudar a resolver esse problema.

Alternativa 1: Utilizar Heroku para Backend e Netlify/Vercel para Frontend

  1. Backend no Heroku:

    • Crie uma conta no Heroku.
    • Instale o Heroku CLI na sua máquina.
    • Inicialize um repositório Git no seu projeto backend, se ainda não tiver.
    • Faça login no Heroku CLI:
      heroku login
      
    • Crie um novo app no Heroku:
      heroku create nome-do-seu-app
      
    • Adicione o banco de dados MySQL ao seu app:
      heroku addons:create jawsdb:kitefin
      
    • Faça o deploy do seu backend:
      git push heroku main
      
  2. Frontend no Netlify ou Vercel:

    • Crie uma conta no Netlify ou Vercel.
    • Conecte seu repositório GitHub/GitLab/Bitbucket onde está o frontend.
    • Configure as variáveis de ambiente no painel do Netlify/Vercel para apontar para o backend no Heroku.

Alternativa 2: Utilizar Render para Backend e Frontend

  1. Backend no Render:

    • Crie uma conta no Render.
    • Crie um novo serviço web e conecte ao repositório do seu backend.
    • Adicione as variáveis de ambiente necessárias no painel do Render.
    • Configure o banco de dados MySQL no Render.
  2. Frontend no Render:

    • Crie um novo serviço estático e conecte ao repositório do seu frontend.
    • Configure as variáveis de ambiente no painel do Render para apontar para o backend.

Configuração do .env

Certifique-se de que seu arquivo .env no frontend está configurado corretamente para apontar para o backend. Por exemplo:

REACT_APP_API_URL=https://nome-do-seu-app.herokuapp.com

Ajuste no Código

Verifique se o URL da API está sendo utilizado corretamente no seu código frontend. Por exemplo:

const apiUrl = process.env.REACT_APP_API_URL;

fetch(`${apiUrl}/login`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ email, senha })
})
.then(response => response.json())
.then(data => {
  console.log(data);
})
.catch(error => {
  console.error('Error:', error);
});

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.