En aquest tema, aprendrem a construir una aplicació de xat en temps real utilitzant Node.js i Socket.io. Aquesta aplicació permetrà als usuaris enviar i rebre missatges en temps real, i serà una excel·lent oportunitat per aplicar molts dels conceptes que hem après al llarg del curs.
Objectius
- Configurar un servidor Node.js amb Express.
- Integrar Socket.io per a la comunicació en temps real.
- Crear una interfície d'usuari bàsica amb HTML i JavaScript.
- Gestionar la connexió i desconnexió dels usuaris.
- Enviar i rebre missatges en temps real.
Requisits Previs
- Coneixements bàsics de Node.js i Express.
- Familiaritat amb HTML i JavaScript.
- Comprensió dels conceptes de programació asíncrona i esdeveniments.
Passos per Construir l'Aplicació de Xat
- Configuració del Projecte
1.1. Crear el Directori del Projecte
1.2. Inicialitzar el Projecte amb npm
1.3. Instal·lar les Dependències Necessàries
- Configuració del Servidor
2.1. Crear el Fitxer server.js
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
const PORT = process.env.PORT || 3000;
app.use(express.static('public'));
io.on('connection', (socket) => {
console.log('New user connected');
socket.on('disconnect', () => {
console.log('User disconnected');
});
socket.on('chatMessage', (msg) => {
io.emit('chatMessage', msg);
});
});
server.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
- Crear la Interfície d'Usuari
3.1. Crear el Directori public i el Fitxer index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Chat App</title>
<style>
body { font-family: Arial, sans-serif; }
#chat { margin: 20px; }
#messages { list-style-type: none; padding: 0; }
#messages li { padding: 8px; margin-bottom: 10px; background: #f4f4f4; border-radius: 5px; }
</style>
</head>
<body>
<div id="chat">
<ul id="messages"></ul>
<form id="messageForm">
<input id="messageInput" autocomplete="off" placeholder="Type a message..." /><button>Send</button>
</form>
</div>
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
const form = document.getElementById('messageForm');
const input = document.getElementById('messageInput');
const messages = document.getElementById('messages');
form.addEventListener('submit', (e) => {
e.preventDefault();
if (input.value) {
socket.emit('chatMessage', input.value);
input.value = '';
}
});
socket.on('chatMessage', (msg) => {
const item = document.createElement('li');
item.textContent = msg;
messages.appendChild(item);
window.scrollTo(0, document.body.scrollHeight);
});
</script>
</body>
</html>
- Provar l'Aplicació
4.1. Executar el Servidor
4.2. Obrir el Navegador i Accedir a http://localhost:3000
- Millores i Funcionalitats Addicionals
5.1. Mostrar Missatges de Connexió i Desconnexió
io.on('connection', (socket) => {
console.log('New user connected');
socket.broadcast.emit('chatMessage', 'A user has connected');
socket.on('disconnect', () => {
console.log('User disconnected');
io.emit('chatMessage', 'A user has disconnected');
});
socket.on('chatMessage', (msg) => {
io.emit('chatMessage', msg);
});
});5.2. Afegir Suport per a Noms d'Usuari
io.on('connection', (socket) => {
let username = 'Anonymous';
socket.on('setUsername', (name) => {
username = name;
});
socket.on('disconnect', () => {
io.emit('chatMessage', `${username} has disconnected`);
});
socket.on('chatMessage', (msg) => {
io.emit('chatMessage', `${username}: ${msg}`);
});
});Exercicis Pràctics
-
Afegir Suport per a Noms d'Usuari:
- Modifica el codi per permetre als usuaris establir un nom d'usuari abans d'enviar missatges.
- Mostra el nom d'usuari al costat de cada missatge.
-
Historial de Missatges:
- Emmagatzema els missatges en una llista al servidor.
- Envia l'historial de missatges als nous usuaris quan es connecten.
-
Estilització Avançada:
- Millora l'estil de la interfície d'usuari amb CSS.
- Afegeix notificacions visuals per a connexions i desconnexions d'usuaris.
Solucions als Exercicis
Solució 1: Afegir Suport per a Noms d'Usuari
<!-- Afegir un camp per al nom d'usuari a index.html -->
<form id="usernameForm">
<input id="usernameInput" autocomplete="off" placeholder="Enter your username..." /><button>Set Username</button>
</form>// Modificar el codi JavaScript per gestionar noms d'usuari
const usernameForm = document.getElementById('usernameForm');
const usernameInput = document.getElementById('usernameInput');
usernameForm.addEventListener('submit', (e) => {
e.preventDefault();
if (usernameInput.value) {
socket.emit('setUsername', usernameInput.value);
usernameForm.style.display = 'none';
messageForm.style.display = 'block';
}
});Solució 2: Historial de Missatges
// Emmagatzemar missatges al servidor
let messages = [];
io.on('connection', (socket) => {
socket.emit('chatHistory', messages);
socket.on('chatMessage', (msg) => {
messages.push(msg);
io.emit('chatMessage', msg);
});
});// Rebre l'historial de missatges al client
socket.on('chatHistory', (msgs) => {
msgs.forEach((msg) => {
const item = document.createElement('li');
item.textContent = msg;
messages.appendChild(item);
});
});Conclusió
En aquest tema, hem construït una aplicació de xat en temps real utilitzant Node.js i Socket.io. Hem après a configurar un servidor, crear una interfície d'usuari bàsica i gestionar la comunicació en temps real entre els usuaris. També hem explorat millores i funcionalitats addicionals per enriquir l'experiència de l'usuari. Aquest projecte és una excel·lent manera de consolidar els coneixements adquirits i preparar-se per a projectes més complexos en el futur.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu
