Introdução
Neste tutorial, você aprenderá a criar uma API simples para fornecer informações em tempo real utilizando Node.js, Socket.io e MongoDB. Vamos desenvolver uma aplicação que permite a comunicação em tempo real entre o servidor e os clientes (front-end em React) por meio de WebSockets, possibilitando que todos os usuários recebam atualizações instantâneas de novos dados. Este guia é ideal para desenvolvedores que desejam integrar capacidades em tempo real em suas aplicações, oferecendo uma experiência interativa mais rica para os usuários e aprendendo a combinar diferentes tecnologias modernas.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter o Node.js e o MongoDB instalados em sua máquina. Você pode baixar o Node.js do site oficial, e para o MongoDB, siga as instruções no site oficial também. Verifique as versões instaladas usando os comandos `node -v` e `mongo –version`. Além disso, crie uma pasta para o seu projeto e inicialize um novo projeto Node.js com `npm init -y`.
commands# Verificar versões instaladas
node -v
mongo --version
# Inicializar um novo projeto
npm init -yInstalação de Dependências
Instale as dependências necessárias para a aplicação. Para este projeto, você precisará de Express, Socket.io e Mongoose. Execute o seguinte comando no terminal na raiz do seu projeto.
commandsnpm install express socket.io mongoose
Configuração do Servidor Node.js
Crie um arquivo chamado `server.js` na raiz do seu projeto. Neste arquivo, você irá configurar o Express e o Socket.io para permitir a comunicação em tempo real. Também incluiremos a conexão com o MongoDB.
server.jsconst express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const mongoose = require('mongoose'); const app = express(); const server = http.createServer(app); const io = socketIo(server); // Conexão com o MongoDB mongoose.connect('mongodb://localhost:27017/meubanco', { useNewUrlParser: true, useUnifiedTopology: true }); io.on('connection', (socket) => { console.log('Um usuário se conectou'); socket.on('disconnect', () => { console.log('Um usuário se desconectou'); }); }); const PORT = process.env.PORT || 3000; server.listen(PORT, () => { console.log(`Servidor rodando na porta ${PORT}`); });
Definição do Modelo de Dados com Mongoose
Crie uma pasta chamada `models` e dentro dela, crie um arquivo chamado `Data.js`. Nesse arquivo, você irá definir um modelo para os dados que serão salvos no MongoDB.
models/Data.jsconst mongoose = require('mongoose'); const dataSchema = new mongoose.Schema({ message: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('Data', dataSchema);
Criando o Endpoint para Receber Dados
No arquivo `server.js`, adicione um endpoint POST que permitirá que os usuários enviem novas mensagens, que serão salvas no MongoDB e emitidas para todos os clientes conectados via Socket.io.
server.js_additional// Adicione ao arquivo server.js app.use(express.json()); app.post('/data', async (req, res) => { const newData = new Data({ message: req.body.message }); await newData.save(); io.emit('newData', newData); res.status(201).send(newData); });
Configurando o Front-end com React
Crie uma nova aplicação React usando Create React App. No diretório do projeto, execute `npx create-react-app client`. Instale a dependência `socket.io-client` usando o comando `npm install socket.io-client` dentro da pasta `client`.
commands# Criar aplicação React
npx create-react-app client
# Navegar para a pasta do cliente
cd client
# Instalar Socket.io Client
npm install socket.io-clientImplementando a Conexão com o Socket.io no React
Dentro da pasta `client/src`, crie um arquivo chamado `App.js`. Neste arquivo, você irá conectar-se ao servidor Socket.io e lidar com eventos de recebimento de dados.
App.jsimport React, { useEffect, useState } from 'react'; import io from 'socket.io-client'; const socket = io('http://localhost:3000'); function App() { const [messages, setMessages] = useState([]); const [input, setInput] = useState(''); useEffect(() => { socket.on('newData', (data) => { setMessages((prev) => [...prev, data]); }); return () => socket.off('newData'); }, []); const sendMessage = () => { fetch('http://localhost:3000/data', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: input }) }); setInput(''); }; return ( <div> <h1>Mensagens em Tempo Real</h1> <input value={input} onChange={(e) => setInput(e.target.value)} /> <button onClick={sendMessage}>Enviar</button> <ul> {messages.map((msg, index) => ( <li key={index}>{msg.message}</li> ))} </ul> </div> ); } export default App;
Executando a Aplicação
Com tudo configurado, primeiro inicie o servidor Node.js utilizando o comando `node server.js`. Em seguida, em outro terminal, navegue até a pasta `client` e execute `npm start` para iniciar o servidor React. Agora você deve conseguir enviar mensagens a partir do front-end e vê-las atualizadas em tempo real.
commands# Iniciar servidor Node.js
node server.js
# Iniciar servidor React
cd client
npm startTestes e Validação
Teste a aplicação acessando o front-end em `http://localhost:3000`, enviando mensagens e verificando se todas as instâncias do navegador recebem as mensagens em tempo real. Você pode abrir várias janelas do navegador para simular diferentes clientes.
commands# Acesse o front-end no navegador
http://localhost:3000
Conclusão
Neste tutorial, você aprendeu a construir uma API que oferece informações em tempo real usando Node.js e Socket.io, integrando-a com um front-end em React e um banco de dados MongoDB. Com a configuração de comunicação em tempo real implementada, você agora possui uma base sólida para desenvolver aplicações mais interativas e dinâmicas. É possível expandir essa aplicação para incluir autenticação, funcionalidades de chat e muito mais, explorando as capacidades do Socket.io para comunicação em tempo real.