Descubre Nest.js, el Framework de desarrollo de Backend para Frontend

Qué-es-cómo-funciona-Nest.js-Framework-desarrollo-Backend-Frontend-Itequia

Descubre Nest.js, el Framework de desarrollo de Backend para Frontend

Gestionar una aplicación a gran escala puede ser tedioso, especialmente cuando se construye sin una estructura bien planificada y una estricta estrategia de organización del código. Esto puede provocar un desastre durante el mantenimiento de la aplicación y debe evitarse a toda costa.

Normalmente estos desastres se deben a los cambios realizados en el código base y a las nuevas características a medida que el proyecto crece en la base de usuarios.

Para tratar de evitar estos problemas, nació Nest.js, que se construyó para ofrecer soluciones a los problemas de estructura y estrategia de organización del código.

¿Qué es Nest.js?

Nest.js es un framework de desarrollo web basado en Node.js que utiliza TypeScript para proporcionar una estructura de programación sólida y altamente escalable.

que-es-nestjs-Itequia

Se inspira en otros frameworks de desarrollo populares, como Angular y Spring, y se centra en la creación aplicaciones de Backend altamente escalables y modulares, aunque también puedes desarrollar aplicaciones web.

Es compatible e incluye integraciones por defecto con una amplia variedad de bases de datos y sistemas de autenticación, y se puede utilizar con una amplia variedad de módulos de terceros para añadir funcionalidades adicionales. Además, se integra con herramientas de testing y depuración para ayudar a probar y depurar el código de la aplicación.

Elementos básicos de la arquitectura de la aplicación

Nest.js es un framework de desarrollo web que mimetiza la arquitectura de Angular en gran medida. Aunque no use librerías de Angular guarda muchas similitudes de arquitectura lo que reduce enormemente la curva de aprendizaje para un desarrollador de Angular.

Si eres desarrollador Frontend de cualquier otro framework sigue siendo tu opción frente a frameworks Backend tradicionales.

Nest.js tiene un enfoque basado en componentes, lo que significa que la aplicación se divide en módulos que contienen componentes, controladores y servicios relacionados. Esto hace que sea más fácil organizar y mantener el código de la aplicación.

Está basado en TypeScript, lo que significa que puede utilizar todas las características de TypeScript en su código como tipos estáticos, clases, herencias, legibilidad, interfaces, decoradores, etc.

Veamos a continuación los elementos de la arquitectura de la aplicación más destacados:

Módulos

En Nest.js, cada aplicación está dividida en módulos, que son conjuntos de componentes, controladores y servicios relacionados que trabajan juntos para realizar una tarea específica.

Puedes conocer más detalles aquí.

Controladores

Los controladores son clases que manejan las solicitudes HTTP y devuelven una respuesta. Los controladores se asignan a rutas específicas, lo que significa que sólo manejarán las solicitudes que coincidan con esa ruta.

Puedes conocer más detalles aquí.

Servicios

Los servicios son clases que contienen lógica de negocio y pueden ser inyectadas en controladores o en otras clases de servicio. Los servicios se utilizan a menudo para interactuar con bases de datos o realizar otras tareas que no son específicas de la lógica de presentación.

Puedes conocer más detalles aquí.

Pipes

Los pipes son clases que se pueden utilizar para transformar o validar los datos que entran o salen de una aplicación. Los pipes se pueden aplicar a los argumentos de los métodos de controlador o a los valores de los campos de entrada y salida de una solicitud o respuesta HTTP.

Puedes conocer más detalles aquí.

Guards

Son componentes que se utilizan para proteger las rutas de acceso no autorizado. Los Guards se pueden utilizar para verificar si un usuario tiene permisos para acceder a una ruta determinada y para tomar medidas adecuadas si no es así.

Puedes conocer más detalles aquí.

Middleware

El middleware es código que se ejecuta entre la llegada de una solicitud y la ejecución del controlador correspondiente. Se puede utilizar para realizar tareas como la autenticación o la validación de datos antes de que lleguen al controlador.

Puedes conocer más detalles aquí.

Decoradores

Los decoradores son funciones que se aplican a clases, métodos o propiedades y modifican su comportamiento. Nest.js incluye varios decoradores predefinidos que se pueden utilizar para realizar tareas como la asignación de rutas a controladores o la inyección de dependencias.

Puedes conocer más detalles aquí.

Además de estos elementos básicos mencionados, Nest.js se puede utilizar con una amplia variedad de módulos de terceros que proporcionan funcionalidades adicionales. Estos módulos pueden incluir cosas como bases de datos, sistemas de autenticación y herramientas de testing.

¿Cuáles son las principales funcionalidades de Nest.js?

Veamos a continuación las principales características de Nest.js:

Flexible

Se puede utilizar tanto para aplicaciones web como de back-end. aunque es más popular como aplicación de back-end.

Escalable y modulable

Principales-funcionalidades-Nest.js-Itequia

Diseñado para ser altamente escalable y modulable, lo que significa que se puede utilizar para crear aplicaciones de gran tamaño y complejidad sin sacrificar la facilidad de uso y la mantenibilidad.

Integración con bases de datos y sistemas de autenticación

Compatible con una amplia variedad de bases de datos y sistemas de autenticación, lo que significa que puede utilizar Nest.js para crear aplicaciones que se conecten a bases de datos o que utilicen mecanismos de autenticación como OAuth.

Compatible con microservicios

Nest.js se puede utilizar para crear aplicaciones basadas en microservicios, lo que significa que puede dividir la aplicación en componentes más pequeños que se pueden desplegar y escalar de forma independiente.

Integración con sistemas de mensajería

Se puede integrar con sistemas de mensajería como RabbitMQ y Kafka, lo que permite a las aplicaciones comunicarse entre sí de forma asíncrona.

Esquema de rutas

Utiliza un esquema de rutas para asignar controladores a rutas específicas, lo que significa que sólo manejarán las solicitudes que coincidan con esa ruta.

Integración con herramientas de testing

Se integra con herramientas de testing como Jest y Mocha, lo que facilita la realización de pruebas unitarias, de integración y de aceptación.

Integración con herramientas de análisis de rendimiento

Se integra con herramientas como New Relic y Application Insights, lo que permite analizar el rendimiento de la aplicación y detectar problemas.

Integración con herramientas de monitoreo

Se integra con herramientas como Prometheus y Grafana, lo que permite monitorizar la aplicación y recopilar métricas.

Integración con herramientas de monitoreo de transacciones

Nest.js se puede integrar con herramientas como APM (Application Performance Monitoring) para monitorizar el rendimiento y la disponibilidad de la aplicación.

Integración con herramientas de logging

Nest.js se integra con herramientas de logging como Winston y Log4js, lo que facilita la recopilación y el análisis de mensajes de registro.

Integración con herramientas de integración continua

Se puede integrar con herramientas como Jenkins y Travis CI, lo que facilita la integración continua y el despliegue automatizado.

Integración con herramientas de análisis de código

Se puede integrar con herramientas como SonarQube y Code Climate, lo que permite analizar el código de la aplicación y detectar problemas de calidad y seguridad.

Integración con herramientas de gestión de configuración

Se puede integrar con herramientas como Consul y Vault, lo que permite gestionar la configuración de la aplicación de forma centralizada y segura.

Integración con herramientas de seguridad

Se puede integrar con herramientas como Auth0 y Okta, lo que permite implementar mecanismos de autenticación y autorización de forma rápida y segura.

Documentación y comunidad

Cuenta con una completa documentación y una activa comunidad de desarrolladores que pueden ayudarle a resolver problemas y aprender más sobre el marco.

¿Qué librerías de terceros podemos integrar en Nest.js?

librerías-terceros-integrar-Nest.js-Itequia

Además, Nest.js viene con una amplia gama de librerías de terceros integradas que facilitan el desarrollo de aplicaciones. Algunas de las librerías más populares incluyen:

Express

Un framework de desarrollo de servidor web que proporciona una amplia variedad de herramientas para manejar solicitudes HTTP y enviar respuestas.

GraphQL

Un lenguaje de consulta y un conjunto de herramientas para trabajar con bases de datos y API de manera más eficiente.

MongoDB

Una base de datos NoSQL que permite almacenar y recuperar datos de manera sencilla

Passport

Un conjunto de módulos que facilitan la implementación de la autenticación y la autorización en las aplicaciones.

Socket.io

Una biblioteca que permite la comunicación en tiempo real entre el servidor y los clientes.

Hands-on |Implementando un primer controlador con Nest.js

Una vez vistas las principales características y funciones de Nest.js, vamos a crear una aplicación de muestra en Nest.js.

La aplicación consistirá en un simple controlador CRUD para gestionar una entidad de usuario. Al controlador se le inyectará un servicio para gestionar la lógica de negocio relativa al usuario. A su vez, el servicio manipulará los datos de usuario a través de un repositorio de usuarios inyectado

Este código muestra la implementación del repositorio de usuarios, el cual es el encargado de guardar los datos y consultarlos.

Nota CleanCode – Para simplificar el artículo, se almacenan datos en memoria, aunque debería almacenar datos en una BBDD como MongoDB. Además, esta capa de repositorio no implementa el patrón repositorio heredando de una interefície estándar IRepository, aunque sería lo recomendable.

import { Injectable } from '@nestjs/common';

import { User } from './user.entity';

@Injectable()

export class UserRepository {

private users: User[] = [];

findAll(): User[] {

return this.users;

}

findOne(id: number): User {

return this.users.find(user => user.id === id);

}

create(user: User): void {

this.users.push(user);

}

update(id: number, user: User): void {

const index = this.users.findIndex(u => u.id === id);

this.users[index] = user;

}

delete(id: number): void {

this.users = this.users.filter(user => user.id !== id);

}

}

Para implementar el servicio que utiliza el repositorio, creamos una interfaz que defina los métodos que desee exponer. Luego, creamos una clase de servicio que implemente la interfaz y utilice el repositorio para realizar las operaciones de CRUD necesarias.

import { Injectable } from '@nestjs/common';

import { UserRepository } from './user.repository';

import { User } from './user.entity';

export interface IUserService {

findAll(): User[];

findOne(id: number): User;

create(user: User): void;

update(id: number, user: User): void;

delete(id: number): void;

}

@Injectable()

export class UserService implements IUserService {

constructor(private readonly userRepository: UserRepository) { }

findAll(): User[] {

return this.userRepository.findAll();

}

findOne(id: number): User {

return this.userRepository.findOne(id);

}

create(user: User): void {

this.userRepository.create(user);

}

update(id: number, user: User): void {

this.userRepository.update(id, user);

}

delete(id: number): void {

this.userRepository.delete(id);

}

}

Con los pasos anteriores listos, ya podemos crear el controlador que deberá definir los métodos del controlador que manejarán las solicitudes HTTP y utilizarán el servicio de usuarios inyectado en su constructor para realizar las operaciones de CRUD necesarias.

import { Controller, Get, Post, Put, Delete, Body } from '@nestjs/common';

import { UserService } from './user.service';

import { User } from './user.entity';

@Controller('users')

export class UserController {

constructor(private readonly userService: UserService) { }

@Get()

findAll(): User[] {

return this.userService.findAll();

}

@Get(':id')

findOne(id: number): User {

return this.userService.findOne(id);

}

@Post()

create(@Body() user: User): void {

this.userService.create(user);

}

@Put(':id')

update(id: number, @Body() user: User): void {

this.userService.update(id, user);

}

@Delete(':id')

delete(id: number

): void {

this.userService.delete(id);

}

}

Finalmente encapsulamos toda esta lógica en su modulo (como lo haríamos en Angular), el cual es el encargado de importar el controlador y los servicios que hemos inyectado en los respectivos constructores de cada clase.

import { Module } from '@nestjs/common';

import { UserController } from './user.controller';

import { UserService } from './user.service';

import { UserRepository } from './user.repository';

@Module({

controllers: [UserController],

providers: [UserService, UserRepository],

})

export class UserModule { }

¿Merece la pena utilizar Nest.js en mis desarrollos?

En conclusión, Nest.js es un marco de aplicaciones de Node.js potente y flexible que se utiliza para crear aplicaciones web y de servidor con un enfoque en la modularización y la escala.

Su integración con TypeScript y Angular lo convierten en una opción atractiva para los desarrolladores que buscan utilizar herramientas modernas y soporte para la programación orientada a objetos.

Además, su amplia comunidad y recursos disponibles lo hacen fácil de aprender y utilizar para los desarrolladores.

En general, podríamos decir que Nest.js es una buena opción para considerar si estás buscando un marco de aplicaciones de Node.js para crear aplicaciones web y de servidor de alta calidad.

Sin embargo, es importante tener en cuenta que Nest.js no es la única opción disponible para crear aplicaciones de Node.js. Existen muchos otros marcos y herramientas (Frameworks como Express, Koa, Hapi o Fastify.) que también pueden ser adecuados para tu proyecto, y es importante evaluar las distintas opciones disponibles y elegir la que mejor se adapte a tus necesidades y preferencias.

Es importante tener en cuenta que el rendimiento y la escalabilidad son factores importantes que considerar a la hora de elegir un marco de aplicaciones de Node.js. Algunos marcos pueden ser más rápidos y fáciles de escalar que otros, y es importante evaluar estos factores para asegurarse de que el marco que elija sea adecuado para tus necesidades.

Además, es importante considerar el tamaño y la complejidad del proyecto al elegir un marco. Si tu proyecto es pequeño y simple, es posible que un marco más ligero y minimalista sea adecuado. Si tu proyecto es grande y complejo, es posible que necesites un marco más robusto y completo que proporcione más funcionalidades y herramientas.

Si estás interesado en utilizar Nest.js para desarrollar aplicaciones web o de Backend, te recomendamos que consultes la documentación oficial de Nest.js para obtener más información sobre cómo utilizar el marco y todas sus características. También puedes buscar tutoriales en línea y ejemplos de código para obtener una idea de cómo se utiliza Nest.js en la práctica.

Sergi Forns – Key Software Developer at Itequia