Veja esse projeto clicando aqui link
imagens geradas no shots.so
mais detalhes do CSS usado neste projeto link para outro repositorio
front-end e back-end dentro do mesmo repositório github hospedados no render
lib p/ fazer requisiçãod do front axios
lib p/ fazer midleware cors
lib p/ gerenciar variaveis de ambiente para deploy dotenv VAI TER QUE DESFAZER USO DESTA LIB
ambiente de execução node.js
framework para back-end express.js
lib p/ driver conectar mongoDB com código back-end mongodb MongoClient +docs exemplos_codigo
pacote para gerenciar melhor o path de respostas do server.js estáticas npm i path path.resolve() path.join()
dependendo da porta de conexão disponível ele executa, se a porta escolhida ta estiver oculpada, mude o numero da porta. Este codigo serve para executar o back-end
node ./api/server.js
atualizar o servidor enquando estou escrevendo no file dele. Depois de control sno file server.js fazer requesição na url (clica na url e clica enter) node --watch ./api/server.js
fazer conta gratuita no mongoDB, criar o cluster , criar database, criar colections "tabelas do BD", permissão para qualquer domínio acessar o cluster, conectar aplicação com o cluster
adicionar string de conexão no codigo backend no arquivo "back-end/api/connet.js". Substitua <db_password> pela sua senha de acesso ao banco mongodb+srv://thiagomasseno3:<db_password>@cluster0.2jukc.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0
adicione campos no collection do mongo DB e execute o arquivo connect.js para testar se conexão funciona node ./api/connect.js
criar um arquivo ./api/insertMany.js e execute para inserir os dados no banco de dados não relacional ````node ./api/insertMany.js```
dentro das duas pastas /front-end e /back-end colocar um arquivo .gitignore com o nome dos arquivos que n serão enviados para o github
node_modules
.env
git remote add origin https://github.com/ThiagoMassenoMaciel/Projeto-13-full-Stack.git
git branch -M main
git push -u origin main
SE O DEPLOY FOSSE UM REPOSITÓRIO NO GIT PARA /BACK-END E OUTRO REPOSITORIO PARA /FRONT-END FAÇA ISSO
depois de hospedado o backend , pegar sua url desse servidor e colocar dentro da variavel URL na pasta do front-end
Quando os arquivos front/back estiverem carregados no servidor , ele vai procurar um arquivo JSON e executar os scripts build e start
Por este motivo além de existir um JSON dentro da pasta /front-end e outro JSON dentro da pasta /back-end é necessário outro arquivo JSON que vai servir globalmente para o servidor na pasta ./ atual
npm init -y
"npm install --prefix back-end && npm install --prefix front-end"
entrar dentro da pasta /front-end ir dentro do arquivo package.json e execute a build que tem dentro dos scripts
" npm run build --prefix front-end"
"scripts": {
"build": "npm install --prefix back-end && npm install --prefix front-end && npm run build --prefix front-end"
},
vai executar o script "start" do package.json que esta dentro da pasta /back-end , ou seja apartir do package.json GLOBAL vou executar outro script de outro package.json
"npm run start --prefix back-end"
"scripts": {
"build": "npm install --prefix back-end && npm install --prefix front-end && npm run build --prefix front-end",
"start": "npm run start --prefix back-end"
},
"node ./api/server.js"
"scripts": {
"start": "node ./api/server.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
build:{
target: "esnext",
},
VERIFICAR se a dependencia do banco de dados MONGOdb esta referenciado no package.json do back-end. Se nãoestiver , executar este comando apartir do caminho no terminal dentro da pasta Back-end
npm instal mongodb
npm run build
npm run start
mudar a URL que o front-end faz requisição de acordo com a variavel de ambiente : se é development, production, ...
NODE_ENV = development
| valor da variavel de ambiente | URL |
|---|---|
| development | "http://localhost:3000/api" |
| outro valor | "dominioDeploy/api" |
e para montar essa lógica preciso acesar o valor das variavel ambiente , farei isso usando dentro do /front-end a biblioteca dotenv
cd .\front-end\
npm i dotenv
e a lógica vai ficar dentro do arquivo ./front-end/api/api.js, faça o import dotenv , acesse valor globalmente e monte a lógica do if para URL
// vai consumir api fazendo uma requisição : Fetch ou Axios
import axios from "axios";
import "dotenv/config"
const {NODE_ENV} = process.env
const URL = NODE_ENV === 'development' ? "http://localhost:3000/api": "/api"
const responseArtists = await axios.get(`${URL}/artists`);
const responseSongs = await axios.get(`${URL}/songs`);
export const artistsArray = responseArtists.data;
export const songsArray = responseSongs.data;
//console.log(responseArtists.data);
CRIAR UMA RESPOSTA DO ./back-end/api/server.js SERVER PARA REDIRECIONAR UM INDEX.HTML ESTÁTICO DA PASTA ./front-end/dist
caso a requisição vier de um rota que não foi definida dentro do file server.js responder á esta rota com arquivo estático da pasta dist
o asterisco * quer dizer todos os endpoint que não foram definidos anteriormente pelo arquivo /back-end/api/server.js
response.sendFile(foulder-path-file-static) quer dizer enviar uma resposta estática no caminho path da pasta dist do front-end
app.use(express.static('../../front-end/dist')); // vai disponibilizar os arquivos do path 'dist' definido como resposta estática
//definir quais endpoints vão receber resposta estática : * todos aqueles que n foram definidos anteriormente
app.get("*", async (request, response)=>{ // se acessar qualquer outra url direciona para home
response.sendFile('../../front-end/dist/index.html')
})
usar um pacote npm i path path.resolve() para gerenciar melhor o exato caminho de onde o comando está sendo executado(esse comando executa apartir do package.json do back-end)
cd .\back-end\
npm i path
import path from "path";
const __dirname = path.resolve()
app.use(express.static(path.join(__dirname,'../front-end/dist')));// esse path pode ser acessado pela url
app.get("*", async (request, response)=>{ // se acessar qualquer outra url direciona para home
response.sendFile(path.join(__dirname,'../front-end/dist/index.html'))
})
parei no minuto 26:07 do video aula complementar da aula 4 do workshop fullStack spotify da hastag treinamentos dentro do meu ssd path (D:\meu arquivos aqui\workshops\hashtag treinamentos 2025 fullstack)
useEffect - adicionar efeitos colaterais, executar funções novamente depois de uma mudança da variavel de estado, executar funções depois que o componente foi desmontado/destruido
npm i react-router-dom
importar os componentes de rotas e acoplar dentro do file App.jsx todos outros componentes que criei
import { BrowserRouter, Routes, Route } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Header/>
<Main/>
</BrowserRouter>
)
}
Pense o que na tela vai ficar e o que vai ficar mudando quando alterar a rota, o header não muda , logo põe ele fora da tag de rotas, home-artists-songs muda , logo põe dentro da tag de rotas
<BrowserRouter>
<Header/>
<Routes>
<Route path="/" element={<Home/>}/>
<Route path="/artists" element={<Artists/>}/>
<Route path="/artist/:id" element={<Artist/>}/>
<Route path="/songs" element={<Songs/>}/>
<Route path="/song/:id" element={<Song/>}/>
</Routes>
</BrowserRouter>
agora todas as tags <a></a> vai ser substituida por ancora <Link></Link> do react-router-dom, e n esqueça de importar toda vez que usar, e outra coisa substitua o href do <a></a> para ser to do <link></link>
//antes
<a href="/path"></a>
//agora
<Link to="/path"></Link>











