Clase 5 - Jueves, 10 de septiembre de 2026 (10 09 26) - Desarrollo de sistemas web backend
ACLARACIÓN: Esta es la clase que debió haberse dado el jueves 10/09/26 pero el profesor tuvo un problema así que nos dejó la grabación del año 2025.
Desarrollo de Sistemas Web Backend: Arquitectura, Manejo de HTTP y Servidores en Node.js
Este documento constituye una guía técnica profunda sobre el desarrollo de servidores web utilizando Node.js en su forma "pura", sin el uso de marcos de trabajo (frameworks) como Express. El objetivo es comprender la arquitectura base del modelo cliente-servidor, el procesamiento de peticiones (requests) y la generación de respuestas (responses).
1. Introducción al Desarrollo Backend con Node.js
El desarrollo backend se centra en la creación de servidores que procesan consultas y responden a las necesidades del cliente. En esta etapa de aprendizaje, se prioriza el uso de Node.js puro para entender la estructura, arquitectura y lógica de las APIs REST desde su base.
Contexto y Relevancia
El conocimiento de los módulos nativos de Node.js permite a un desarrollador comprender cómo se gestionan los recursos, la memoria y las conexiones antes de pasar a herramientas de abstracción mayor. El flujo de trabajo básico consiste en un ciclo de consultas que son procesadas y respondidas por el servidor de manera transparente para el usuario.
2. Marco Conceptual y Definiciones Clave
Para interactuar con el backend, es fundamental comprender los pilares del protocolo HTTP y los módulos esenciales de Node.js.
Conceptos Fundamentales
- Modelo Cliente-Servidor: Estructura donde los clientes (navegadores, herramientas como Postman) realizan solicitudes a un servidor que procesa la información y devuelve un resultado.
- Módulo HTTP: Módulo nativo de Node.js que permite la creación de servidores capaces de escuchar peticiones en puertos específicos.
- Módulo FS (File System): Herramienta para interactuar con el sistema de archivos, permitiendo leer y servir archivos (como HTML).
- Módulo URL: Permite parsear o "desglosar" las direcciones web para extraer rutas y parámetros.
- API REST: Interfaz de programación que utiliza los métodos HTTP para realizar operaciones sobre datos.
Métodos HTTP Principales
El servidor identifica la intención del cliente a través de verbos o métodos:
| Método | Descripción | Uso Sugerido |
| GET | Recuperar información del servidor. | Consultar datos públicos o listas. |
| POST | Enviar datos al servidor para crear recursos. | Envío de usuarios, contraseñas o carritos de compra. |
| PUT | Actualización completa de un recurso. | Modificar un registro existente. |
| PATCH | Actualización parcial de un recurso. | Cambiar solo un campo de un registro. |
| DELETE | Eliminar un recurso específico. | Borrado de datos. |
| HEAD | Solicita solo los encabezados de la respuesta. | Pruebas de conectividad y metadatos. |
3. Anatomía de la Comunicación: Request y Response
Cada interacción en el servidor se basa en dos objetos fundamentales proporcionados por el método createServer: la Request (petición) y la Response (respuesta).
La Petición (Request)
Contiene toda la información que el cliente envía al servidor. Sus propiedades más importantes son:
- Method: El verbo HTTP utilizado (GET, POST, etc.).
- URL: El path o ruta completa de la petición (ej.
/productos). - Headers (Encabezados): Metadatos que describen la petición, como el
Host,Content-Typey elUser-Agent. - User-Agent: Identifica qué software está realizando la petición (Chrome, Firefox, Postman, etc.).
- HTTP Version: La versión del protocolo utilizada.
La Respuesta (Response)
Es la información que el servidor devuelve. Se gestiona mediante:
- writeHead: Método para escribir los encabezados de respuesta, definiendo el código de estado y el tipo de contenido.
- write: Método para enviar el cuerpo de la respuesta (texto, HTML o JSON).
- end: Método crucial que cierra la conexión y finaliza la operación para liberar recursos de memoria.
Códigos de Estado HTTP (Status Codes)
- 200 (OK): La petición fue exitosa (el "camino feliz").
- 404 (Not Found): El recurso o la ruta no existen.
- 500 (Internal Server Error): Error genérico del servidor, usualmente por fallos en la lógica o conexión a base de datos.
4. Implementación y Lógica del Servidor
El desarrollo de un servidor implica establecer validaciones y filtrados basados en la información recibida en la Request.
Filtrado por Encabezados (User-Agent)
Es posible restringir el acceso al servidor dependiendo del cliente que realiza la consulta. Por ejemplo, se puede programar el servidor para que detecte si una petición proviene de Postman y, en tal caso, devolver un error 404, permitiendo únicamente el acceso desde navegadores web. Esto se logra analizando el string del User-Agent y convirtiéndolo a minúsculas (toLowerCase) para una comparación efectiva.
Manejo de Rutas y Navegación
Mediante condicionales (if o switch), el servidor puede responder de manera distinta según el pathname solicitado:
- Rutas de API: Devolución de objetos JSON (ej.
/productos). - Rutas de Frontend: Devolución de páginas HTML (ej.
/home,/about). - Favicon: Petición automática del navegador para obtener el icono de la pestaña; debe ser gestionada para evitar errores innecesarios.
Generación Dinámica de HTML
El servidor puede "dibujar" contenido HTML dinámicamente utilizando plantillas multilínea (backticks `). Un caso común es recorrer un array de objetos (obtenidos de una base de datos simulada) y generar una tabla HTML mediante un ciclo forEach, insertando los datos de cada producto en celdas (<td>).
5. Ejemplos Prácticos y Flujos de Trabajo
Caso 1: Consulta de Productos (JSON)
- El cliente solicita
GET /productos. - El servidor valida el método y la ruta.
- Se llama a una función asíncrona que simula la obtención de datos de una base de datos.
- Si hay éxito (bloque
try), se devuelve un código 200 y el objeto JSON con una propiedadok: true. - Si falla (bloque
catch), se devuelve un código 500 y el detalle del error.
Caso 2: Interacción con el Frontend (Servicio de Archivos)
El servidor puede utilizar el método readFile del módulo fs para buscar un archivo index.html en una carpeta específica (ej. public). Al encontrarlo, envía el contenido al cliente. Este archivo HTML puede contener scripts que utilicen la función fetch para comunicarse de vuelta con el servidor, cerrando el ciclo cliente-servidor.
6. Errores Comunes y Aclaraciones
- No cerrar la conexión: Olvidar el método
res.end()provoca que la petición quede "colgada", consumiendo recursos innecesariamente. - Confusión entre Request y Response: Es un error frecuente intentar leer datos de la respuesta o escribir datos en la petición. La
Requestes de entrada; laResponsees de salida. - Case Sensitivity en Headers: Para evitar errores al filtrar por encabezados, siempre se recomienda convertir los strings a minúsculas antes de comparar.
- Etiquetas HTML: Al generar HTML desde el backend, es vital cerrar todas las etiquetas (
</table>,</body>) fuera de los ciclos de repetición para no romper la estructura de la página.
7. Síntesis y Conclusiones
El desarrollo backend con Node.js puro se fundamenta en la manipulación precisa del protocolo HTTP. Al dominar el objeto request, el desarrollador puede filtrar conexiones y entender el origen de los datos; al dominar el objeto response, puede entregar información en diversos formatos (JSON, HTML, Texto). La arquitectura debe ser lógica y prever siempre un "camino feliz" y un manejo de errores mediante bloques try/catch y códigos de estado adecuados.
8. Preguntas de Repaso
Nivel Básico
- ¿Cuál es la función principal del módulo
httpen Node.js? - ¿Qué sucede si un servidor no ejecuta el método
res.end()? - Nombre tres métodos HTTP y su función principal.
Nivel Intermedio
- ¿Por qué es importante el encabezado
User-Agenten una petición? - Explique la diferencia entre un código de estado 200, 404 y 500.
- ¿Cómo se puede servir un archivo HTML estático desde Node.js puro?
Nivel Avanzado
- Describa el proceso para generar una tabla HTML dinámica en el servidor a partir de un array de objetos.
- ¿Qué ventajas ofrece el uso de funciones asíncronas (
async/await) al consultar una base de datos desde el servidor? - ¿Cómo implementaría un filtro de seguridad básico para bloquear herramientas de testing como Postman?