NestJS

Curso de programación con Nest

NestJS es el framework para construir aplicaciones backend escalables y eficientes en Node.js. Aprende a desarrollar con NestJS y mejora tu backend.

Aprende Nest GRATIS y certifícate

NestJS es un framework progresivo de Node.js que combina elementos de programación orientada a objetos, programación funcional y programación reactiva funcional. 

Construido con TypeScript y fuertemente inspirado en Angular, NestJS proporciona una arquitectura escalable y mantenible para el desarrollo de aplicaciones del lado del servidor.

Filosofía y arquitectura del framework

NestJS adopta una arquitectura modular que facilita la organización del código en aplicaciones complejas. El framework utiliza decoradores de TypeScript y un sistema de inyección de dependencias robusto, permitiendo crear aplicaciones altamente testeable y mantenibles.

La estructura basada en módulos permite dividir la aplicación en componentes reutilizables y bien definidos. Cada módulo encapsula un conjunto relacionado de funcionalidades, promoviendo la separación de responsabilidades y facilitando el desarrollo en equipo.

@Module({
  imports: [DatabaseModule],
  controllers: [UserController],
  providers: [UserService],
  exports: [UserService]
})
export class UserModule {}

Sistema de controladores y enrutamiento

Los controladores en NestJS manejan las peticiones HTTP entrantes y devuelven respuestas al cliente. Utilizan decoradores para definir rutas y métodos HTTP, proporcionando una sintaxis clara y expresiva para la definición de endpoints.

@Controller('users')
export class UserController {
  @Get()
  findAll(): string {
    return 'Esta acción devuelve todos los usuarios';
  }

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return 'Esta acción añade un nuevo usuario';
  }
}

El enrutamiento se gestiona mediante decoradores que mapean métodos HTTP específicos a funciones del controlador. Esta aproximación permite crear APIs RESTful de manera intuitiva y mantiene el código organizado según las operaciones que realiza.

Inyección de dependencias y servicios

El sistema de inyección de dependencias es uno de los pilares fundamentales de NestJS. Los servicios se definen como providers que pueden ser inyectados en controladores u otros servicios, promoviendo la reutilización de código y facilitando las pruebas unitarias.

@Injectable()
export class UserService {
  private readonly users: User[] = [];

  create(user: User): User {
    this.users.push(user);
    return user;
  }

  findAll(): User[] {
    return this.users;
  }
}

Los providers pueden tener diferentes scopes de vida, desde singleton hasta request-scoped, permitiendo un control granular sobre la gestión de instancias y el estado de la aplicación.

Integración con bases de datos

NestJS se integra perfectamente con TypeORM, uno de los ORM más populares para TypeScript. Esta integración permite trabajar con bases de datos relacionales utilizando el patrón Active Record o Data Mapper, proporcionando una capa de abstracción robusta para las operaciones de base de datos.

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

El patrón Repository facilita la separación entre la lógica de negocio y el acceso a datos, permitiendo crear consultas complejas de manera type-safe y manteniendo la consistencia en toda la aplicación.

Validación y transformación de datos

El framework incluye un sistema de pipes que permite validar y transformar datos de entrada antes de que lleguen a los controladores. Utilizando bibliotecas como class-validator, es posible definir reglas de validación declarativas directamente en los DTOs (Data Transfer Objects).

export class CreateUserDto {
  @IsString()
  @IsNotEmpty()
  name: string;

  @IsEmail()
  email: string;

  @IsInt()
  @Min(18)
  age: number;
}

La serialización automática permite controlar qué datos se exponen en las respuestas de la API, proporcionando una capa adicional de seguridad y control sobre la información que se envía al cliente.

Middleware y interceptores

Los middlewares en NestJS funcionan de manera similar a Express.js, permitiendo ejecutar código antes de que la petición llegue al controlador. Son útiles para tareas como logging, autenticación, y modificación de peticiones.

Los interceptores proporcionan una funcionalidad más avanzada, permitiendo transformar tanto peticiones como respuestas, implementar caché, manejar timeouts, y ejecutar lógica adicional antes y después de la ejecución del método del controlador.

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const now = Date.now();
    return next
      .handle()
      .pipe(
        tap(() => console.log(`Después... ${Date.now() - now}ms`))
      );
  }
}

Seguridad y autenticación

NestJS proporciona herramientas robustas para implementar autenticación y autorización. El framework se integra con Passport.js, permitiendo utilizar múltiples estrategias de autenticación como JWT, OAuth, y autenticación local.

Los guards actúan como middleware de autorización, determinando si una petición debe ser procesada por el controlador basándose en criterios como roles de usuario, permisos, o estado de autenticación.

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}

@Controller('protected')
@UseGuards(JwtAuthGuard)
export class ProtectedController {
  @Get()
  getProtectedResource() {
    return 'Este recurso está protegido';
  }
}

Gestión de errores y logging

El manejo de errores en NestJS es centralizado y configurable. El framework proporciona filtros de excepción que capturan errores no manejados y los transforman en respuestas HTTP apropiadas.

El sistema de logging integrado permite registrar eventos importantes de la aplicación, con diferentes niveles de severidad y la posibilidad de configurar múltiples transportes para los logs.

Herramientas de desarrollo

El NestJS CLI es una herramienta de línea de comandos que acelera el desarrollo proporcionando generadores para controladores, servicios, módulos, y otros componentes. También incluye comandos para ejecutar, construir, y probar la aplicación.

nest generate controller users
nest generate service users
nest generate module users

La integración con TypeScript proporciona tipado estático, autocompletado inteligente, y detección temprana de errores, mejorando significativamente la experiencia de desarrollo y la calidad del código.

Escalabilidad y rendimiento

NestJS está diseñado para aplicaciones empresariales que requieren alta escalabilidad y rendimiento. El framework soporta microservicios, permitiendo dividir aplicaciones monolíticas en servicios más pequeños y especializados.

La arquitectura basada en módulos facilita el desarrollo en equipo y permite que diferentes partes de la aplicación evolucionen independientemente, reduciendo el acoplamiento y mejorando la mantenibilidad a largo plazo.

El soporte nativo para programación asíncrona y la integración con RxJS permiten manejar operaciones concurrentes de manera eficiente, optimizando el rendimiento de la aplicación en escenarios de alta carga.

Aprende Nest GRATIS online

Tutoriales de Nest

Aprende Nest con tutoriales de programación en Nest.

Ejercicios de programación de Nest

Evalúa tus conocimientos en Nest con ejercicios de programación Nest de tipo Test, Puzzle, Código y Proyecto con VSCode.

Tipo de tecnología

Framework

Categoría laboral

Backend

Año de lanzamiento

2017

Developers

Kamil Mysliwiec

Todos los módulos del curso de Nest

Ver todos los módulos de Nest

Otras tecnologías

C
C

C

Backend

Lenguaje de propósito general, eficiente y de bajo nivel.

Rust
Rust

Rust

Backend

Lenguaje de programación de sistemas enfocado en seguridad, concurrencia y rendimiento.

R
R

R

Ciencia de Datos e IA

Lenguaje para análisis estadístico, manipulación de datos y visualización gráfica.

TypeScript
TypeScript

TypeScript

Full Stack

Superconjunto de JavaScript con tipado estático.

Go
Go

Go

Backend

Lenguaje de programación eficiente y concurrente creado por Google.

Hibernate
Hibernate

Hibernate

Backend

ORM para Java, simplifica el acceso a bases de datos.

Django
Django

Django

Backend

Framework web Python para desarrollo rápido y seguro.

Apache Spark
PySpark

PySpark

Big Data

Motor unificado de análisis de datos distribuido para grandes volúmenes.

Java

Java

Backend

Lenguaje de programación versátil y multiplataforma.

Node.js
Node

Node

Backend

Node.js es un entorno de ejecución de JavaScript basado en el motor V8 de Google.

OpenCV
OpenCV

OpenCV

Ciencia de Datos e IA

Biblioteca de Python para Computer Vision en imágenes y vídeos.

Selenium
Selenium

Selenium

Testing / QA

Suite de herramientas open-source para automatizar navegadores web y pruebas de software de interfaz de usuario.

React
React

React

Frontend

Librería framework para frontend interfaces de usuario.

Vue.js
Vuejs

Vuejs

Frontend

Framework de JS progresivo para construir interfaces de usuario reactivas y modulares.

Docker
Docker

Docker

DevOps

Plataforma de contenedores para aplicaciones portátiles.

PHP
PHP

PHP

Backend

Lenguaje de programación para desarrollo web del lado del servidor, el motor del ecosistema Wordpress.

CSharp

CSharp

Backend

Lenguaje C# de Microsoft para desarrollo en el ecosistema .NET para todo tipo de aplicaciones.

Express
Express

Express

Backend

Framework web minimalista para Node.js.

Streamlit
Streamlit

Streamlit

Ciencia de Datos e IA

Biblioteca Python para prototipado web UI rápido en ciencia de datos.

Seaborn

Seaborn

Ciencia de Datos e IA

Biblioteca de visualización de datos para Python.

FastAPI
FastAPI

FastAPI

Backend

Framework web moderno y rápido para Python.

Fundamentos

Fundamentos

Full Stack

Fundamentos y bases de la programación de software moderna.

SQL

SQL

Bases de datos

Lenguaje para gestionar bases de datos relacionales.

TensorFlow
TensorFlow

TensorFlow

Ciencia de Datos e IA

Biblioteca Python para redes neuronales en Deep Learning

Tailwind CSS
TailwindCSS

TailwindCSS

Frontend

Framework de utilidades CSS para diseños rápidos y personalizables.

Flask
Flask

Flask

Backend

Microframework web para Python, simple y flexible.

Git
Git

Git

DevOps

Sistema de control de versiones distribuido.

scikit-learn
ScikitLearn

ScikitLearn

Ciencia de Datos e IA

Biblioteca de aprendizaje automático en Python.

Laravel
Laravel

Laravel

Backend

Framework de PHP para desarrollo web backend.

Kotlin
Kotlin

Kotlin

Backend

Lenguaje de programación moderno y seguro para aplicaciones Android.

NumPy
Numpy

Numpy

Ciencia de Datos e IA

Biblioteca Python para computación científica y matrices.

HTML5
HTML

HTML

Frontend

Lenguaje de marcado para estructurar contenido web.

Spring Boot
SpringBoot

SpringBoot

Backend

Framework para desarrollo rápido de aplicaciones Java.

GNU Bash
Bash

Bash

Administración de sistemas

Intérprete de comandos para sistemas Unix y Linux.

2022-09-27T22:26:51.030457 image/svg+xml Matplotlib v3.6.0, https://matplotlib.org/
Matplotlib

Matplotlib

Ciencia de Datos e IA

Biblioteca Python para crear gráficos y visualizaciones.

Bootstrap
Bootstrap

Bootstrap

Frontend

Framework CSS para diseños web responsive y modernos.

JavaScript
JavaScript

JavaScript

Full Stack

Lenguaje de scripting para desarrollo web interactivo.

pandas
Pandas

Pandas

Ciencia de Datos e IA

Herramienta Python para análisis y manipulación de datos.

Angular
Angular

Angular

Frontend

Framework web de Google para aplicaciones dinámicas.

CSS
CSS

CSS

Frontend

Lenguaje de estilo para diseñar páginas web atractivas.

Python
Python

Python

Backend

Lenguaje de programación fácil de aprender y versátil.

Acceder a todas las tecnologías