Clase 4 - Jueves, 03 de septiembre de 2026 (03 09 26) - Desarrollo de sistemas web backend
Desarrollo de Sistemas Web Backend: Servidores HTTP y Manejo de Errores en Node.js
Este documento constituye una guía integral sobre los fundamentos de la creación de servidores web utilizando Node.js, el protocolo HTTP, la gestión de errores y la transición hacia arquitecturas de backend más complejas. Basado en el cierre de la Unidad 1 del programa académico, este material sintetiza conceptos teóricos, implementaciones prácticas y estándares de la industria.
1. Introducción al Desarrollo de Servidores en Node.js
Node.js se distingue por su arquitectura orientada a eventos y su capacidad para manejar operaciones de forma asíncrona. La transición de scripts simples a la construcción de servidores implica entender cómo Node.js interactúa con el sistema operativo y la red.
Contexto del Entorno de Ejecución
Node.js permite la ejecución de tareas tanto síncronas como asíncronas:
- Funciones Síncronas: Son tareas que se ejecutan en tiempo real y bloquean los procesos posteriores. Ejemplos comunes incluyen cálculos matemáticos complejos (como hashing) o versiones síncronas de lectura en el sistema de archivos (
fs.readFileSync). Si se procesan archivos de gran tamaño o hay múltiples usuarios concurrentes, el uso de funciones síncronas puede generar "cuellos de botella" críticos. - Funciones Asíncronas: Son la esencia de Node.js. Permiten delegar tareas y continuar con la ejecución del hilo principal. Se basan en el concepto de Promesas, que garantizan una respuesta en un "tiempo razonable".
2. Marco Conceptual: El Protocolo HTTP
La comunicación en la web se fundamenta en el modelo Cliente-Servidor a través del protocolo HTTP.
El Ciclo Request-Response
Toda comunicación HTTP se divide en dos componentes esenciales:
- Request (Petición): La consulta que el cliente (navegador, aplicación móvil, etc.) envía al servidor. Contiene información sobre el método, la URL y, opcionalmente, datos en el cuerpo (body).
- Response (Respuesta): La devolución del servidor hacia el cliente. Incluye un código de estado (status code), encabezados (headers) y el contenido solicitado.
Nota sobre la bidireccionalidad: A diferencia de los WebSockets (que permiten comunicación bidireccional en tiempo real), el HTTP estándar no mantiene un túnel constante; cada par petición-respuesta es una unidad de comunicación independiente y asíncrona.
Métodos HTTP e Idempotencia
Los métodos definen la acción que se desea realizar sobre un recurso. Un concepto clave es la Idempotencia: un método es idempotente si realizar la misma operación varias veces produce el mismo resultado que realizarla una sola vez.
| Método | Propósito | Idempotente |
| GET | Recuperar información. | Sí |
| POST | Crear un nuevo recurso o enviar datos. | No |
| PUT | Actualizar o reemplazar un recurso existente. | Sí |
| DELETE | Eliminar un recurso. | Sí |
| PATCH | Modificar parcialmente un recurso. | Depende de la implementación |
3. Códigos de Estado (HTTP Status Codes)
Los códigos de estado son fundamentales para que el cliente comprenda el resultado de su petición. Se clasifican en cinco categorías:
| Rango | Clasificación | Descripción |
| 100 - 199 | Respuestas Informativas | Ejemplo: 101 Switching Protocols (usado en el paso a WebSockets). |
| 200 - 299 | Éxito | 200 OK (éxito estándar), 201 Created (recurso creado con éxito). |
| 300 - 399 | Redirecciones | 301 Moved Permanently (el recurso cambió de URL de forma definitiva). |
| 400 - 499 | Errores del Cliente | 400 Bad Request, 401 Unauthorized, 404 Not Found. |
| 500 - 599 | Errores del Servidor | 500 Internal Server Error, 502 Bad Gateway. |
4. Desarrollo de un Servidor HTTP Básico en Node.js
Para construir un servidor sin depender de frameworks externos (como Express), se utiliza la librería nativa http.
Estructura de Código Esencial
Un servidor básico requiere aproximadamente 15 líneas de código para ser funcional. Los pasos principales son:
- Importar el módulo:
const http = require('node:http'); - Crear el servidor: Se utiliza el método
createServer, que recibe una función con los parámetrosreq(request) yres(response). - Definir Encabezados y Cuerpo: Se escribe el estado (ej. 200) y el contenido.
- Escuchar en un puerto: El método
listenactiva el servidor en una IP (usualmentelocalhosto127.0.0.1) y un puerto específico.
Puertos y Seguridad
- Puertos Reservados: Puertos como el 22 (SSH), 3389 (RDP) o 5432 (PostgreSQL) están destinados a servicios específicos. Para desarrollo web se suelen usar puertos por encima del 1000 (ej. 3000, 8080).
- Seguridad: El tráfico HTTP es plano y puede ser interceptado (sniffing). La evolución segura es HTTPS, que utiliza certificados SSL/TLS y conceptos de criptografía para garantizar la autenticidad e integridad de la transmisión.
5. Manejo de Errores y Flujos de Control
El manejo de errores es una de las tareas más críticas para garantizar que el sistema sea escalable y robusto.
Clasificación de Errores
- Errores Operacionales: Fallos esperables en una función (ej. se esperaba un número y se recibió un texto). Pueden gestionarse logueando el error sin detener el sistema.
- Errores del Programador: Errores catastróficos derivados de una mala lógica, como no prever estados en funciones anidadas o fallos en la aserción de tipos. Estos pueden causar el cierre (crash) del proceso.
Estructura Try-Catch-Finally
Es la forma más ordenada de gestionar flujos lógicos:
- Try: Bloque donde se ejecuta el código que se espera que funcione (el "camino feliz").
- Catch: Se activa solo si ocurre un error en el bloque
try. Permite "atrapar" el error y decidir qué hacer (loguearlo, enviar una notificación o reintentar). - Finally: Bloque de ejecución obligatoria, independientemente de si hubo éxito o error. Se utiliza para la liberación de recursos (cerrar archivos, limpiar memoria o desconectar bases de datos).
El Concepto de "Callback Hell"
Se refiere a la acumulación piramidal de funciones anidadas que manejan errores de manera desordenada. Esto dificulta el debugging (depuración), ya que se pierde el rastro de en qué nivel falló la lógica. La solución moderna es el uso de async/await y Promesas.
6. Ejemplos Prácticos y Casos de Uso
Simulación de Base de Datos con Latencia
En entornos de aprendizaje, se utilizan arrays de objetos para simular una base de datos. Para replicar el comportamiento real de una conexión de red, se emplea setTimeout.
- Escenario: Una función
pedirProductosque tarda 2 segundos en responder, simulando el tiempo que un servidor de base de datos tardaría en procesar unSELECT * FROM.
Ruteo (Routing) Manual
Sin frameworks, el servidor debe analizar la URL para decidir qué responder:
- Se utiliza la librería
urlpara parsear la petición. - Se extrae el
pathname(ej./productos). - Se verifica el método (ej.
GET). - Si no coinciden la ruta y el método, el servidor debe devolver un error
404 Not Found.
Simulación de Fallo de Infraestructura
Un servidor robusto debe estar preparado para fallos aleatorios. En las pruebas de clase, se implementó una función con un 10% de probabilidad de error para demostrar cómo el sistema debe capturar un error 500 y mostrar un mensaje de "Intente más tarde" en lugar de colapsar completamente.
7. Fechas Importantes y Avisos Académicos
Tras el análisis de las fuentes, se han identificado las siguientes indicaciones organizativas:
- Cierre de Unidad 1: La clase actual marca el fin de la primera unidad temática.
- Actividad Integradora: Se publicará próximamente en el aula virtual un trabajo práctico sencillo para cerrar la unidad. Será una actividad de integración centrada en la comprensión de conceptos y no exclusivamente en la codificación compleja.
- Inicio de Unidad 2: A partir de la próxima sesión se comenzará a trabajar con estructuras de código basadas en servidores más avanzados, incorporando bases de datos reales y frameworks.
- Aviso sobre Grabaciones: El profesor notificó que la sesión actual no fue grabada por un descuido técnico, por lo que este documento y el material del aula son los recursos principales de consulta.
8. Preguntas de Repaso
Nivel Básico
- ¿Cuál es la diferencia fundamental entre una función síncrona y una asíncrona en Node.js?
- ¿Qué significan las siglas HTTP y cuáles son sus dos componentes básicos?
- ¿Para qué sirve el bloque
finallyen una estructura de control de errores?
Nivel Intermedio
- Explique el concepto de idempotencia y mencione qué métodos HTTP cumplen con esta propiedad.
- ¿Qué sucede si un servidor Node.js realiza una operación síncrona muy pesada mientras tiene múltiples peticiones de usuarios?
- ¿En qué rango de códigos de estado se encuentran los errores provocados por el cliente (ej. URL mal escrita)?
Nivel Avanzado
- Describa cómo el "Callback Hell" afecta la legibilidad y el mantenimiento de una aplicación de backend.
- Si un servidor recibe una petición
POSTen una ruta definida solo paraGET, ¿qué código de estado sería el más apropiado para responder y por qué? - Explique la importancia de normalizar las respuestas del servidor (payloads) mediante funciones helper.