Consumiendo Arquitectura Hexagonal en Aplicaciones Node.js con Express

Heads up!

This summary and transcript were automatically generated using AI with the Free YouTube Transcript Summary Tool by LunaNotes.

Generate a summary for free
Buy us a coffee

If you found this summary useful, consider buying us a coffee. It would help us a lot!

Introducción

En el desarrollo de software moderno, la arquitectura hexagonal se presenta como una potente opción que permite estructurar las aplicaciones de manera que se facilite la mantenibilidad y la escalabilidad. En este artículo, exploraremos cómo implementar la arquitectura hexagonal en una aplicación de Node.js utilizando Express. Este tutorial es ideal para quienes ya tienen conocimientos básicos de programación y desean profundizar en patrones de diseño de software. Si aún no has seguido la series anteriores sobre dominio, aplicación e infraestructura, te invitamos a hacerlo para entender mejor las bases de lo que vamos a construir aquí.

Vamos a utilizar el módulo de usuarios, que hemos creado en videos previos, y en este tutorial, lo llevaremos a la práctica. A través de un ejemplo sencillo, te mostraré cómo manejar las interacciones externas, las peticiones de usuarios y cómo estructurar el código con las capas de dominio y aplicación.

Configurando el Proyecto

Para comenzar, asegúrate de tener el ambiente de desarrollo preparado. Usaremos TypeScript junto con Node.js. Primero, debemos instalar express, typescript, y ts-node como dependencias de desarrollo.

npm install express typescript ts-node --save-dev

Asegúrate de inicializar tu proyecto de TypeScript:

npx tsc --init

Esto generará un archivo tsconfig.json donde podrás realizar las configuraciones necesarias para tu proyecto.

Estructura de la Aplicación

Al implementar esta arquitectura, es fundamental seguir la separación de responsabilidades, lo que nos permitirá reutilizar los módulos en otras aplicaciones.

Capas de Arquitectura Hexagonal

  1. Dominio: Contiene la lógica de negocio.
  2. Aplicación: Se encarga de gestionar las reglas de la aplicación y orquestar las interacciones del dominio.
  3. Infraestructura: Maneja la comunicación con el mundo exterior (p. ej., bases de datos, APIs externas).

Configuración de Express

Creamos nuestro archivo principal (main.ts) e importamos Express:

import express, { Request, Response, NextFunction } from 'express';
const app = express();
const PORT = 3000;

app.use(express.json()); // Middleware para parsear JSON

app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

Creando el Router de Usuarios

Definimos un router para manejar las rutas de usuarios:

import { Router } from 'express';
const userRouter = Router();

userRouter.get('/users', (req, res, next) => {
    // Lógica para obtener usuarios
});

// Otros métodos como POST, PUT y DELETE

export default userRouter;

Controladores

Creamos controladores para manejar la lógica de negocio y mapear las respuestas:

class UserController {
    async getAll(req: Request, res: Response, next: NextFunction) {
        try {
            // lógica para obtener a todos los usuarios
        } catch (error) {
            next(error);
        }
    }
}

Manejo de Errores

Configura el middleware para manejar errores globalmente:

app.use((err: any, req: Request, res: Response, next: NextFunction) => {
    const status = err.status || 500;
    res.status(status).json({ message: err.message });
});

Implementación de Casos de Uso

Cada caso de uso debe ser una función que interactúa con el dominio. Podemos implementar un caso de uso para crear un nuevo usuario:

async createUser(data: UserData) {
    // lógica para crear un nuevo usuario
}

Realizando Peticiones HTTP

Usaremos una herramienta como Thunder Client para realizar pruebas sobre nuestras rutas y verificar que todo funcione correctamente. Realiza peticiones a las rutas definidas para asegurarte de que lo que implementamos cumple con lo esperado.

Conclusión

Como hemos visto, implementar la arquitectura hexagonal utilizando Express en Node.js es un proceso claro si seguimos un conjunto de pasos bien definidos. Esta arquitectura no solo mejora la mantenibilidad y escalabilidad de la aplicación, sino que también nos permite reutilizar componentes en futuras implementaciones. En futuros tutoriales, exploraremos cómo llevar los mismos conceptos a un entorno de NestJS, permitiéndonos diversificar aún más nuestras aplicaciones.


Elevate Your Educational Experience!

Transform how you teach, learn, and collaborate by turning every YouTube video into a powerful learning tool.

Download LunaNotes for free!