En este módulo, vamos a construir una aplicación de chat en tiempo real utilizando Node.js y Socket.io. Este proyecto te permitirá aplicar muchos de los conceptos que has aprendido a lo largo del curso, como la creación de servidores HTTP, el manejo de eventos y la comunicación en tiempo real.
Objetivos del Módulo
- Crear un servidor HTTP con Node.js.
- Configurar Socket.io para la comunicación en tiempo real.
- Implementar la lógica del servidor para manejar conexiones y mensajes de chat.
- Crear una interfaz de usuario simple para el chat utilizando HTML y JavaScript.
- Integrar la interfaz de usuario con el servidor para enviar y recibir mensajes.
Requisitos Previos
Antes de comenzar, asegúrate de tener instalados Node.js y NPM en tu máquina. También necesitarás conocimientos básicos de HTML y JavaScript.
Paso 1: Configuración del Proyecto
1.1 Crear el Directorio del Proyecto
Primero, crea un nuevo directorio para tu proyecto y navega a él desde la terminal:
1.2 Inicializar un Proyecto Node.js
Inicializa un nuevo proyecto Node.js ejecutando el siguiente comando:
Esto creará un archivo package.json
con la configuración predeterminada.
1.3 Instalar Dependencias
Instala las dependencias necesarias para el proyecto:
Paso 2: Crear el Servidor
2.1 Configurar el Servidor HTTP
Crea un archivo llamado server.js
en el directorio raíz del proyecto y agrega el siguiente código:
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('chat message', (msg) => { io.emit('chat message', msg); }); }); server.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
Explicación del Código
- Express: Utilizamos Express para servir archivos estáticos.
- http: Creamos un servidor HTTP utilizando el módulo
http
de Node.js. - socket.io: Configuramos Socket.io para manejar la comunicación en tiempo real.
- io.on('connection'): Escuchamos nuevas conexiones de clientes.
- socket.on('disconnect'): Manejamos la desconexión de clientes.
- socket.on('chat message'): Escuchamos mensajes de chat y los retransmitimos a todos los clientes conectados.
Paso 3: Crear la Interfaz de Usuario
3.1 Estructura de Archivos
Crea un directorio llamado public
en el directorio raíz del proyecto. Dentro de public
, crea un archivo llamado index.html
y un directorio llamado js
.
3.2 Crear el Archivo HTML
En public/index.html
, agrega el siguiente código:
<!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> <link rel="stylesheet" href="style.css"> </head> <body> <div id="chat-container"> <ul id="messages"></ul> <form id="chat-form"> <input id="message-input" autocomplete="off" placeholder="Type a message..." /> <button>Send</button> </form> </div> <script src="/socket.io/socket.io.js"></script> <script src="js/main.js"></script> </body> </html>
3.3 Crear el Archivo JavaScript
En public/js/main.js
, agrega el siguiente código:
const socket = io(); const form = document.getElementById('chat-form'); const input = document.getElementById('message-input'); const messages = document.getElementById('messages'); form.addEventListener('submit', (event) => { event.preventDefault(); if (input.value) { socket.emit('chat message', input.value); input.value = ''; } }); socket.on('chat message', (msg) => { const item = document.createElement('li'); item.textContent = msg; messages.appendChild(item); window.scrollTo(0, document.body.scrollHeight); });
Explicación del Código
- socket.emit('chat message'): Envía el mensaje de chat al servidor.
- socket.on('chat message'): Escucha los mensajes de chat del servidor y los agrega a la lista de mensajes.
Paso 4: Ejecutar la Aplicación
Para ejecutar la aplicación, simplemente ejecuta el siguiente comando en la terminal:
Abre tu navegador y navega a http://localhost:3000
. Deberías ver la interfaz de chat y poder enviar mensajes.
Ejercicio Práctico
Ejercicio 1: Añadir Nombres de Usuario
Modifica la aplicación para que los usuarios puedan ingresar su nombre antes de unirse al chat. Muestra el nombre del usuario junto con cada mensaje.
Solución
- Modifica
public/index.html
para incluir un campo de nombre de usuario:
<div id="username-container"> <input id="username-input" placeholder="Enter your name..." /> <button id="join-chat">Join Chat</button> </div> <div id="chat-container" style="display: none;"> <!-- existing chat elements --> </div>
- Modifica
public/js/main.js
para manejar el nombre de usuario:
const usernameInput = document.getElementById('username-input'); const joinChatButton = document.getElementById('join-chat'); const usernameContainer = document.getElementById('username-container'); const chatContainer = document.getElementById('chat-container'); let username = ''; joinChatButton.addEventListener('click', () => { username = usernameInput.value.trim(); if (username) { usernameContainer.style.display = 'none'; chatContainer.style.display = 'block'; } }); form.addEventListener('submit', (event) => { event.preventDefault(); if (input.value && username) { socket.emit('chat message', { username, message: input.value }); input.value = ''; } }); socket.on('chat message', (data) => { const item = document.createElement('li'); item.textContent = `${data.username}: ${data.message}`; messages.appendChild(item); window.scrollTo(0, document.body.scrollHeight); });
- Modifica
server.js
para manejar los datos del mensaje:
Conclusión
En este módulo, has aprendido a construir una aplicación de chat en tiempo real utilizando Node.js y Socket.io. Has configurado un servidor HTTP, manejado conexiones y mensajes de chat, y creado una interfaz de usuario simple. Este proyecto te ha permitido aplicar muchos de los conceptos que has aprendido a lo largo del curso y te ha proporcionado una base sólida para construir aplicaciones en tiempo real más complejas.
En el siguiente módulo, exploraremos cómo crear una API de comercio electrónico, lo que te permitirá profundizar en la creación de aplicaciones web robustas y escalables.
Curso de Node.js
Módulo 1: Introducción a Node.js
Módulo 2: Conceptos Básicos
Módulo 3: Sistema de Archivos y E/S
Módulo 4: HTTP y Servidores Web
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos