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