Clase 6 - Jueves, 17 de septiembre de 2026 (17 09 26) - Desarrollo de sistemas web backend
ACLARACIÓN: Esta es la clase que debió haberse dado el jueves 17/09/26 pero el profesor tuvo un problema así que nos dejó la grabación del año 2025.
Desarrollo de Sistemas Web Backend: De Módulos Nativos a Express.js
Este documento constituye una guía de estudio exhaustiva sobre la transición del desarrollo de servidores web utilizando herramientas nativas de Node.js hacia el uso de frameworks especializados, con un enfoque profundo en Express.js y la arquitectura de software.
1. Introducción General
El desarrollo de aplicaciones backend en Node.js ha evolucionado desde la gestión manual de protocolos de red hasta el uso de abstracciones potentes que facilitan la escalabilidad y el mantenimiento. Comprender el funcionamiento interno de los módulos nativos es fundamental para apreciar el valor de los frameworks y para tomar decisiones arquitectónicas informadas que equilibren la simplicidad, la seguridad y el rendimiento.
Contexto del tema
En el ecosistema de Node.js, la creación de servidores comenzó con los módulos básicos http y url. Sin embargo, a medida que las aplicaciones crecen en complejidad, la gestión manual de rutas, métodos, cabeceras y respuestas se vuelve "engorrosa". Aquí es donde surgen los frameworks como Express.js, que actúan como capas de abstracción para simplificar estas tareas.
Importancia y Relevancia
- Abstracción vs. Control: Los frameworks alivian la carga de trabajo, pero pueden llevar a un desarrollo "autómata". Conocer las bases permite entender qué sucede "bajo el capó".
- Seguridad y Dependencias: Cada paquete añadido (como Express) introduce subdependencias. Es vital usar solo lo estrictamente necesario para minimizar riesgos de seguridad y vulnerabilidades.
- Eficiencia: Permite elegir entre una solución minimalista (módulos nativos) para tareas simples o una estructura robusta (Express) para proyectos escalables.
2. Marco Conceptual
Definición de conceptos clave
- Framework: Un conjunto de herramientas y convenciones que proporcionan una estructura para el desarrollo de software, facilitando la creación de aplicaciones al automatizar tareas repetitivas.
- Middleware: Funciones que se ejecutan entre la recepción de una solicitud (request) y el envío de una respuesta (response). Se utilizan para tareas como registro de logs, filtrado de datos, análisis de metadatos o autenticación.
- Módulos Nativos (
**http**y**url**): Librerías incorporadas en Node.js que permiten levantar servidores y procesar direcciones web sin necesidad de instalar paquetes externos. - Scaffolding: El proceso de crear la estructura básica de carpetas y archivos de un proyecto de forma automatizada.
- Entry Point: El archivo principal (comúnmente
app.jsoindex.js) que actúa como el "pase de abordar" del aplicativo, donde se inicializa el servidor y se agrupan las dependencias.
3. Desarrollo del Tema: El Camino hacia Express.js
3.1. Trabajo con Módulos Nativos
Antes de adoptar Express, es crucial dominar la creación de servidores mediante el módulo http.
- Manejo de Eventos: Al recibir información (especialmente en métodos como POST), los datos llegan en fragmentos o "chunks". Se utilizan eventos específicos:
data: Para capturar los fragmentos de información entrante.end: Crucial para indicar que la transmisión ha terminado. Cerrar la conexión es una buena práctica para evitar fugas de recursos (time outs innecesarios).
- Análisis de Rutas: El módulo
urlse utiliza para el parsing (análisis) de las direcciones y para identificar los métodos HTTP que vienen en las solicitudes.
3.2. Introducción a Express.js
Express se define como un framework minimalista y bien sistematizado. Su objetivo es levantar servicios web de manera rápida y limpia.
Inicialización de un Proyecto
- Creación del directorio y navegación:
mkdir proyecto && cd proyecto. - Inicio de paquetería:
npm init. Este comando solicita información (nombre, versión, descripción, entry point) y genera el archivopackage.json. - Instalación:
npm install express. Esto añade Express y sus dependencias (aproximadamente 65 paquetes adicionales) al proyecto.
Anatomía de un Servidor Express Básico
Un servidor funcional puede crearse en aproximadamente 12 líneas:
- Se requiere el módulo Express.
- Se define la instancia de la aplicación (
const app = express()). - Se asocian métodos (GET, POST) a rutas específicas.
- Se utiliza una función anónima (o flecha) con dos parámetros:
request(lo que viene) yresponse(lo que se devuelve). - Se realiza el binding o escucha en un puerto específico (ej. 4000).
3.3. Arquitectura y Estructura de Carpetas (Patrón de Cascada)
Para proyectos profesionales, se recomienda una separación clara de responsabilidades en lugar de tener todo en un solo archivo:
| Carpeta/Archivo | Función |
**app.js** | Entry point; configura middlewares globales, prefijos de rutas e inicia el servidor. |
| Routers | Declaran los caminos o rutas (ej. /api/users) y dirigen el tráfico hacia los controladores. |
| Middlewares | Capas intermedias para procesamiento (logs, validaciones, manejo de errores). |
| Controllers | Actúan como el "pasamanos". Reciben la petición del router, llaman al servicio o modelo y deciden qué respuesta (y código HTTP) devolver. |
| Models | Representan la estructura de los datos y contienen la lógica de interacción (actualmente simulada con arrays, próximamente con bases de datos). |
| Services | Contienen la lógica de negocio pura, separada de la interacción HTTP. |
4. Relaciones entre Conceptos
Vinculación HTTP y Base de Datos (Conceptos CRUD)
Existe una correlación directa entre los métodos HTTP y las operaciones que se realizan en una base de datos (SQL):
- GET: Equivalente a un
SELECT * FROM. Se usa para obtener información. - POST: Equivalente a un
INSERT INTO. Se usa para crear nuevos registros. - PUT: Equivalente a un
UPDATE. Se utiliza para modificar registros existentes. - DELETE: Equivalente a un
DELETE FROM. Se usa para eliminar registros.
Jerarquía de Ejecución
- Request entra al servidor.
- Pasa por los Middlewares (si existen).
- El Router identifica la ruta y el método.
- El Controller recibe la carga y solicita datos al Model/Service.
- El Model devuelve el resultado al Controller.
- El Controller envía la Response final al cliente.
5. Ejemplos Prácticos
Ejemplo de Prefijo de Rutas
En app.js, se puede definir un prefijo para organizar las versiones de una API:
// Todo lo que esté en userRoutes tendrá el prefijo /api/users
app.use('/api/users', userRoutes);
Ejemplo de Lógica en Modelos (Simulación con Arrays)
Cuando no hay base de datos, se usan métodos de arrays de JavaScript:
- Crear: Se utiliza el método
.push(). - Buscar: Se utiliza
.find()o.findIndex(). - Eliminar: Se utiliza
.splice().
6. Express Generator: Scaffolding Avanzado
El comando express-generator permite crear una estructura completa automáticamente, incluyendo soporte para motores de vistas (frontend).
Características principales:
- Motores de Plantilla (View Engines): Permiten servir HTML dinámico.
- EJS: Recomendado por su similitud con HTML.
- PUG (antes Jade): Utiliza una sintaxis más simplificada pero distinta al HTML estándar.
- HBS (Handlebars): Utiliza llaves para la iteración de datos.
- Carpeta
**public**: Lugar para archivos estáticos (CSS, imágenes, JavaScript del lado del cliente). - Carpeta
**bin/www**: Archivo donde se encuentra la configuración cruda del servidor y la definición del puerto (por defecto suele ser el 3000 o 7000 según la configuración).
7. Errores Comunes y Aclaraciones
- No cerrar conexiones nativas: Olvidar el método
enden el módulohttpprovoca que el servidor quede consumiendo recursos sin sentido (time out). - Confusión de Puertos: Intentar levantar un servidor en un puerto ya ocupado. Express Generator permite configurar esto en la carpeta
bin/www. - Abuso de dependencias: Instalar frameworks pesados para tareas que se resuelven con 10 líneas de código nativo aumenta innecesariamente la superficie de ataque (vulnerabilidades).
- Uso de IDs numéricos en rutas: Aunque común en ejemplos básicos, se menciona que existen formas más recomendables de manejar identificadores únicos para evitar problemas de seguridad o previsibilidad.
8. Síntesis y Conclusiones
- Modularidad: La clave de un backend escalable es separar las rutas de los controladores y los modelos.
- Minimalismo: Express es potente porque no "contamina" el código con herramientas innecesarias, a menos que se use el generador.
- Evolución: El software tiene un ciclo de vida; las actualizaciones de paquetes son necesarias debido a que el desarrollo es una "foto en la historia" que debe evolucionar.
9. Preguntas de Repaso
Nivel Básico
- ¿Cuál es la diferencia principal entre el método
datay el métodoenden un servidor HTTP nativo? - ¿Qué comando se utiliza para inicializar un archivo
package.json? - ¿Para qué sirve el archivo
app.jsen una estructura de Express?
Nivel Intermedio
- Explique cómo se relacionan los métodos HTTP (GET, POST, PUT, DELETE) con las operaciones de una base de datos.
- ¿Qué es un middleware y en qué parte del flujo de una petición se ejecuta?
- ¿Por qué es importante incluir el directorio
node_modulesen el archivo.gitignore?
Nivel Avanzado
- Compare las ventajas y desventajas de utilizar Express Generator frente a una construcción manual paso a paso de las carpetas del proyecto.
- Describa el flujo completo de una petición desde que llega al Router hasta que el Controller emite una respuesta, mencionando la función del Model.
Recordatorios Importantes:
- Participación Colaborativa: Se insta a subir las soluciones al foro para fomentar el aprendizaje mutuo.
- Libertad de Herramientas: Para el trabajo final, el uso de Express Generator es electivo, pero se recomienda seguir la arquitectura de cascada (Model-Controller-Router).
- Recomendación Técnica: Para el uso de motores de vistas en la próxima tarea, se sugiere el uso de EJS.
- Advertencia: El profesor enfatiza que no solo importa que el código funcione, sino saber fundamentar por qué se eligió cierta estructura o método.