Saltar al contenido principal

Introducción a Nest.js

Nest.js es un marco de trabajo progresivo, eficiente y versátil para construir aplicaciones escalables y mantenibles en el lado del servidor. Está construido utilizando TypeScript y combina elementos de la programación orientada a objetos y la programación funcional. Nest.js sigue el patrón arquitectónico Modelo-Vista-Controlador (MVC) y proporciona una base sólida para el desarrollo de aplicaciones en el lado del servidor.

En este tutorial, exploraremos la historia, características y ejemplos de Nest.js para comprender sus capacidades y cómo se puede utilizar para construir aplicaciones robustas.

Historia de Nest.js​

Nest.js fue creado por Kamil Myśliwiec en 2017 como un proyecto de código abierto. Se inspiró en Angular y aprovecha sus potentes características como la inyección de dependencias, los decoradores y los módulos. El marco de trabajo rápidamente ganó popularidad debido a su fuerte apoyo de la comunidad, su extensa documentación y su facilidad de uso.

Características de Nest.js​

1. Arquitectura Modular y Escalable​

Nest.js promueve una arquitectura modular, que permite a los desarrolladores organizar su código en módulos reutilizables e independientes. Cada módulo encapsula funcionalidades relacionadas, lo que facilita el mantenimiento y la escalabilidad de la aplicación. Los módulos se pueden importar y exportar fácilmente, lo que permite reutilizar el código en diferentes partes de la aplicación.

// Ejemplo de un módulo simple en Nest.js

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}

2. Inyección de Dependencias​

Nest.js aprovecha el poder de la inyección de dependencias para gestionar las dependencias entre diferentes componentes de una aplicación. Esto permite un acoplamiento más suelto y facilita las pruebas de los componentes individuales. Las dependencias se pueden inyectar utilizando decoradores, lo que hace que el código sea más legible y mantenible.

// Ejemplo de inyección de dependencias en Nest.js

import { Injectable } from '@nestjs/common';
import { CatsRepository } from './cats.repository';

@Injectable()
export class CatsService {
constructor(private catsRepository: CatsRepository) {}

findAll(): string[] {
return this.catsRepository.findAll();
}
}

3. Decoradores y Metadatos​

Nest.js hace un uso extensivo de decoradores y metadatos para definir el comportamiento y la configuración de varios componentes. Los decoradores se utilizan para marcar clases, métodos, propiedades y parámetros, proporcionando información adicional al marco de trabajo. Esto permite características poderosas como enrutamiento, validación y serialización.

// Ejemplo de uso de decoradores en Nest.js

import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';

@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {}

@Get()
findAll(): string[] {
return this.catsService.findAll();
}
}

4. Herramienta CLI Potente​

Nest.js proporciona una potente herramienta de interfaz de línea de comandos (CLI) que simplifica el proceso de desarrollo. La CLI permite a los desarrolladores generar módulos, controladores, servicios y otros componentes con solo unos pocos comandos. También proporciona soporte para pruebas, linting y construcción de aplicaciones listas para producción.

5. Middleware e Interceptors​

Nest.js admite el uso de middleware e interceptores para manejar preocupaciones transversales comunes como el registro, la autenticación y el manejo de errores. Las funciones de middleware se pueden utilizar para modificar los objetos de solicitud y respuesta, mientras que los interceptores se pueden utilizar para modificar los datos que fluyen entre los componentes.

// Ejemplo de uso de middleware en Nest.js

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: Function) {
console.log('Solicitud...');
next();
}
}

// Aplicando middleware a una ruta
app.use(LoggerMiddleware);

6. Soporte para WebSockets​

Nest.js proporciona soporte incorporado para la comunicación mediante WebSockets utilizando bibliotecas como Socket.io y WebSocket. Esto permite una comunicación bidireccional en tiempo real entre el servidor y el cliente, lo que lo hace adecuado para aplicaciones que requieren actualizaciones instantáneas, como aplicaciones de chat o herramientas colaborativas.

// Ejemplo de uso de WebSockets en Nest.js

import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';

@WebSocketGateway()
export class ChatGateway {
@WebSocketServer()
server: Server;

handleConnection(client: any) {
// Lógica para manejar nuevas conexiones de WebSocket
}

handleMessage(client: any, payload: any) {
// Lógica para manejar mensajes entrantes
}
}

Ejemplos de Aplicaciones Nest.js​

1. API RESTful​

Nest.js se puede utilizar para construir API RESTful robustas y escalables. Con su soporte para enrutamiento, middleware y decoradores, la construcción de puntos finales se vuelve sencilla. Aquí tienes un ejemplo de una API RESTful simple que gestiona una colección de gatos:

// Ejemplo de una API RESTful simple en Nest.js

import { Controller, Get, Post, Body } from '@nestjs/common';
import { CatsService } from './cats.service';

@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {}

@Get()
findAll(): string[] {
return this.catsService.findAll();
}

@Post()
create(@Body() cat: string) {
this.catsService.create(cat);
}
}

// Uso de ejemplo:
// GET /cats - Devuelve un array de todos los gatos
// POST /cats - Crea un nuevo gato

2. Aplicación de Chat en Tiempo Real​

Nest.js también se puede utilizar para construir aplicaciones en tiempo real utilizando WebSockets. Aquí tienes un ejemplo de una aplicación de chat simple utilizando el WebSocket gateway:

// Ejemplo de una aplicación de chat simple en Nest.js

import { WebSocketGateway, WebSocketServer, SubscribeMessage } from '@nestjs/websockets';
import { Server } from 'socket.io';

@WebSocketGateway()
export class ChatGateway {
@WebSocketServer()
server: Server;

@SubscribeMessage('message')
handleMessage(client: any, payload: any) {
this.server.emit('message', payload);
}
}

// Uso de ejemplo:
// El cliente emite un evento 'message' con un payload
// El servidor transmite el mensaje a todos los clientes conectados

Para obtener más información y documentación detallada, visita el sitio web oficial de Nest.js: https://nestjs.com