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. Puede provocar un desastre durante el mantenimiento y debe evitarse a toda costa. Este desastre se debe 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.

Nest.js, por otro lado, se construyó para ofrecer soluciones a los problemas de estructura y estrategia de organización del código. Combina enfoques modernos y modulares de los principios de la ingeniería del software.

Nest.js utiliza TypeScript para la comprobación de tipos y proporciona una arquitectura de software lista para usar para crear y desplegar aplicaciones comprobables, escalables, poco acopladas y fáciles de mantener.

En este artículo, exploraremos Nest.js y lo que puedes construir con él. También explicaremos los pros y los contras del framework para darte una idea clara de por qué las empresas lo prefieren a otros frameworks de Node.js. Y antes de terminar, demostraremos cómo crear una API de tareas con Nest.js.

¿Qué es Nest.js?

Nest.js es uno de los frameworks de Node.js de más rápido crecimiento para construir aplicaciones backend eficientes, escalables y de nivel empresarial utilizando Node.js. Es conocido por producir aplicaciones altamente comprobables, mantenibles y escalables utilizando el moderno JavaScript y TypeScript.

Logotipo de Nest.js
El logotipo oficial de Nest.js. (Fuente de la imagen: Behance)

Con más de 46,6k estrellas y 5,4k bifurcaciones en GitHub, y un recuento de descargas semanales de hasta 700.000, el framework es un recurso popular para elaborar tu proyecto de backend con Node.js.

Nest.js es una solución perfecta para tu próximo proyecto si necesitas construir una aplicación escalable, mantenible y de nivel empresarial.

En la siguiente sección, exploraremos para qué se utiliza y diferentes empresas que utilizan el framework en producción.

¿Para Qué Se Utiliza Nest.js?

Nest.js es un framework Node.js de servidor que es ideal para crear aplicaciones de backend altamente comprobables y mantenibles. Puedes crear innumerables tipos de aplicaciones con Node.js; sólo estás limitado por las características de tus aplicaciones.

Dado que el framework aprovecha TypeScript, Nest.js es especialmente popular entre los equipos que buscan aprovechar la potencia de comprobación de tipos de TypeScript. Además, es sencillo de aprender y dominar, con una potente CLI que aumenta la productividad y la facilidad de desarrollo. Esta potente CLI hace que sea muy fácil poner en marcha cualquier proyecto a nivel de servidor y llevarlo a cabo.

Además, Nest.js mantiene una documentación detallada, y su comunidad de desarrolladores y colaboradores es muy activa y está preparada para responder a los problemas sobre la marcha.

Estas razones hacen que sea fácil ver por qué tantas empresas están cambiando de framework en favor de Nest.js. A continuación se muestra una lista de las pocas marcas populares que utilizan el framework en producción.

Roche

Roche es una multinacional de la salud que opera en dos divisiones, la farmacéutica y la de diagnóstico. Esta empresa estadounidense de biotecnología utiliza el framework Nest.js en su sitio web principal para atender de forma fiable a sus pacientes y ampliar sus servicios.

Una captura de pantalla que muestra la página oficial de Roche con el texto "Doing now what patients need next" (Haciendo ahora lo que los pacientes necesitan a continuación) y la foto de una mujer sonriente.
La página oficial de Roche.

Adidas

Adidas es el mayor fabricante de ropa deportiva de Europa y el segundo del mundo. Adidas es conocida por diseñar y fabricar calzado, ropa y accesorios. Su alcance global y su popularidad son los motivos por los que decidieron utilizar el framework Nest.js, altamente escalable, para crear aplicaciones eficientes a gran escala para su marca.

Una captura de pantalla que muestra la página de inicio de Adidas con el texto "Run for the oceans" y una foto de varios pares de zapatillas.
La página oficial de Adidas.

Decathlon

Decathlon es un minorista de artículos deportivos con más de 1.500 tiendas en 57 países. Decathlon eligió Nest.js como backend de su aplicación web para ayudarles a escalar y mantener su código base heredado.

Una captura de pantalla que muestra la página de inicio de Decathlon con el texto "Juguemos este verano" y fotos de dos ciclistas, aventureros en una barca de remos y una tienda de campaña.
La página oficial de Decathlon.

Puedes encontrar una lista de otras empresas, proyectos y herramientas construidas con Nest.js en GitHub.

A continuación, hablaremos de por qué tú y tu empresa deberíais elegir Nest.js para vuestro próximo proyecto, y daremos una idea de por qué otros ya utilizan el framework y sus ventajas.

Por Qué Elegir Nest.js

La elección de un framework depende del tipo de aplicación que estés desarrollando, ya que diferentes aplicaciones requieren un conjunto diferente de herramientas.

Aquí enumeraremos diferentes razones para elegir Nest.js como tu framework Node.js para actualizar o construir tu próximo proyecto.

  • Nest.js es fácil de aprender y dominar, especialmente para los desarrolladores que vienen del mundo Angular. Esto hace que el proceso de desarrollo sea rápido y eficiente, ya que los miembros del equipo pueden adaptarse fácilmente a cualquier nuevo principio y estructura de desarrollo.
  • El framework es conocido por tener una gran estructura arquitectónica para aplicaciones empresariales desde el primer momento, lo que hace que la construcción de aplicaciones empresariales altamente escalables y mantenibles sea un juego de niños.
  • Puedes construir servicios backend que van desde API RESTful, aplicaciones GraphQL, aplicaciones MVC, Web sockets, CLI y trabajos Cron con Nest.js con facilidad. Parte de la arquitectura estándar ya está incorporada en el framework de Nest.js.
  • Como Nest.js utiliza tecnologías modernas como TypeScript, patrones arquitectónicos a prueba de balas, una excelente documentación y pruebas unitarias sencillas, puedes crear aplicaciones escalables y mantenibles listas para la empresa.
  • Nest.js se creó para construir aplicaciones de monolitos y microservicios a gran escala, en las que la arquitectura ya está controlada, y sólo tienes que construir tu lógica de negocio.
  • Nest.js admite y proporciona grandes módulos basados en la comunidad y soportados por Nest para construir cualquier característica específica de tu elección, desde conceptos como TypeORM, Mongoose y GraphQL hasta el registro, la validación, el almacenamiento en caché, los WebSockets y mucho más.

A continuación, vamos a explorar los pros y los contras de Nest.js. Esto te ayudará a consolidar tu decisión de adoptar el framework, ya que hablaremos tanto de lo bueno como de lo malo.

Ventajas y Desventajas de Nest.js

Aquí enumeraremos los pros y los contras de Nest.js para comprender mejor por qué es un framework tan popular en el ecosistema Node.js.

Los Pros

Algunas de las ventajas de utilizar Nest.js son

  • Potente pero fácil de usar: El framework es fácil de usar para los desarrolladores, lo suficiente como para que incluso las funciones más complejas y potentes sean fáciles de usar. El equipo de Nest.js ha diseñado el framework para que los desarrolladores puedan empezar a trabajar rápidamente y centrarse únicamente en escribir la lógica de negocio mientras el framework se encarga de otros aspectos importantes del desarrollo, como la seguridad.
  • Sintaxis de estilo Angular (backend): Angular es un framework frontend muy popular que se centra en la arquitectura y la estructuración. Nest.js actúa como Angular para el backend porque utiliza el estilo y la sintaxis de Angular para ayudarte a estructurar tu proyecto empresarial.
  • TypeScript: Nest.js es compatible con TypeScript desde el principio, y esto resuelve el rendimiento y la escritura de aplicaciones mantenibles rápidamente al proporcionar errores de compilación y advertencias. TypeScript está bien integrado en VSCode para un entorno de desarrollo accesible.
  • Documentación exhaustiva: Nest.js cuenta con una de las mejores documentaciones para cualquier framework, que es muy fácil de entender. Se ahorra tiempo de depuración al ojear rápidamente la documentación y encontrar la solución al problema.
  • Buena arquitectura y desarrollo rápido: Nest.js te ahorra tiempo a la hora de construir tu aplicación, tanto si estás creando tu primer MVP como la aplicación real, porque te da una estructura y arquitectura sólidas con las que trabajar desde el principio, mejorando así tus procesos de desarrollo.

Los Contras

Hay un famoso dicho: «Toda ventaja tiene sus inconvenientes», y Nest.js no es una excepción. Así que vamos a explorar los contras de Nest.js.

  • Difícil para los novatos: Nest.js puede ser un poco difícil de aprender y dominar para los desarrolladores novatos que no vienen de un entorno Angular. Además, dado que no todos los desarrolladores de JavaScript utilizan TypeScript, el framework también puede ser difícil para estos grupos de desarrolladores. Pero como cualquier otra tecnología, requiere tiempo y práctica.
  • Depuración ardua: Aunque TypeScript tiene sus ventajas y beneficios, también conlleva muchos problemas de depuración, especialmente para los desarrolladores más novatos en el mundo de TypeScript.

Ahí lo tienes: los pros y los contras de Nest.js y cómo pueden influir en tu decisión de elegirlo como framework.

A continuación, vamos a poner en práctica la construcción de una API RESTful con Nest.js para consolidar lo que hemos aprendido hasta ahora. Sigue leyendo para aprender a desarrollar una API de tareas pendientes que permita a los usuarios crear y gestionar sus listas de tareas pendientes.

Construye tu Primera API RESTful de Nest.js

Es hora de practicar todo lo que hemos aprendido sobre Nest.js construyendo nuestra primera API RESTful para demostrar la potencia y la simplicidad que conlleva.

Empezaremos por configurar el framework e instalar todas las herramientas necesarias para ponerlo en marcha.

1. Configuración de Nest.js

En primer lugar, instalamos la CLI de Nest para crear nuevos proyectos con este comando:

npm i -g @nestjs/cli

Después, crea un nuevo proyecto con este comando

nest new nest-todo-api
cd nest-todo-api
npm run start:dev

Ahora que tenemos la CLI de Nest instalada y nuestro nuevo proyecto creado con éxito, vamos a construir nuestra API.

Abre el proyecto en cualquier editor de código de tu elección. Si visitas localhost:3000, deberías ser recibido con un mensaje de bienvenida que muestra que todo funciona correctamente.

A continuación, configuraremos una base de datos MongoDB para conectarnos y gestionar nuestros datos de tareas pendientes en el proyecto.

Antes de entrar en materia, vamos a generar todos los archivos que necesitaremos para crear la API con los siguientes comandos:

nest generate module todos
nest generate controller todos
nest generate service todos

2. Configurar MongoDB

A continuación, instalaremos y configuraremos MongoDB para que funcione con el proyecto que hemos creado antes.

Después de instalar MongoDB en tu máquina local, ejecuta el siguiente comando para instalar la biblioteca Mongoose en nuestro proyecto recién creado:

npm install --save @nestjs/mongoose mongoose

Eso es todo lo que tienes que hacer.

A continuación, generaremos los archivos e importaremos Mongoose para comunicarnos con el proyecto y con MongoDB.

Vamos a importar Mongoose en nuestro archivo de módulo de aplicación antes de generar los demás archivos necesarios:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MongooseModule } from '@nestjs/mongoose';
import { TodosModule } from './todos/todos.module';

@Module({
  imports: [MongooseModule.forRoot('mongodb://localhost/todos), TodosModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

3. Construir el Schema

A continuación, construiremos el schema de nuestra base de datos. Este schema especificará cómo se representarán los datos en nuestra base de datos.

Vamos a definirlo en nuestro archivo todos.schema.ts:

import * as mongoose from 'mongoose';
export const ItemSchema = new mongoose.Schema({
  title: String,
  is_completed: Boolean,
  description: String,
});

4. Definición de Interfaces

A continuación, crearemos una interfaz para la comprobación de tipos.

Vamos a definirla en nuestro archivo interfaces/todo.interface.ts:

import { Document } from 'mongoose';
export interface Item extends Document {
  id?: string;
  title: string;
  description?: string;
  is_completed: boolean;
}

5. Creación del DTO

Por último, construiremos un DTO (Objeto de Transferencia de Datos) que defina cómo se enviarán o pasarán los datos de objeto a objeto a través de la red.

Es una clase básica con la misma propiedad que nuestro schema:

// ./dto/create-todo.ts
export class CreateItemDto {
  readonly title: string;
  readonly description: string;
  readonly is_completed: boolean;
}

6. Configurar el Modelo/Servicio

El archivo de servicio es el responsable de interactuar y comunicarse con la base de datos MongoDB. Se utiliza para crear, recuperar, actualizar y eliminar registros del esquema todos que creamos anteriormente.

Abre tu archivo de servicio y añade los siguientes códigos:

import { Injectable } from '@nestjs/common';
import { Todo } from './interfaces/todo.interface';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
import { CreateTodoDto } from './dto/create-todo.dto';

@Injectable()

export class ItemsService {
  constructor(@InjectModel('Todo') private readonly todoModel: Model) {}
  async findAll(): Promise<Todo[]> {
    return await this.todoModel.find();
  }
  async findOne(id: string): Promise {
    return await this.todoModel.findOne({ _id: id });
  }
  async create(item: CreateItemDto): Promise {
    const newTodo = new this.todoModel(item);
    return await newTodo.save();
  }
  async delete(id: string): Promise {
    return await this.todoModel.findByIdAndRemove(id);
  }
  async update(id: string, todo: CreateTodoDto): Promise {
    return await this.todoModel.findByIdAndUpdate(id, todo, { new: true });
  }
}

El fragmento de código anterior representa una aplicación CRUD (crear, leer, actualizar, eliminar) en nuestra API que utiliza el modelo Mongoose para proporcionarles acceso a nuestra base de datos MongoDB subyacente.

A continuación, crearemos nuestro archivo controlador para manejar toda la lógica y comunicarnos con el servicio que hemos creado anteriormente.

7. Configurar los Controladores

El controlador es el responsable de manejar las solicitudes de ingreso y enviar las respuestas al cliente.

Vamos a definir nuestro controlador Todo y a pegar el siguiente fragmento de código:

import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
} from '@nestjs/common';
import { CreateTodoDto } from './dto/create-todo.dto';
import { TodosService } from './todos.service';
import { Todo } from './interfaces/todo.interface';

@Controller('items')

export class ItemsController {
  constructor(private readonly todosService: TodosService) {}

  @Get()
  findAll(): Promise<Todo[]> {
    return this.todosService.findAll();
  }
  
  @Get(':id')
  findOne(@Param('id') id): Promise {
    return this.todosService.findOne(id);
  }
  
  @Post()
  create(@Body() createTodoDto: CreateTodoDto): Promise {
    return this.todosService.create(createTodoDto);
  }
  
  @Delete(':id')
  delete(@Param('id') id): Promise {
    return this.todosService.delete(id);
  }
  
  @Put(':id')
  update(@Body() updateTodoDto: CreateTodoDto, @Param('id') id): Promise {
    return this.todosService.update(id, updateTodoDto);
  }
}

El framework utiliza anotaciones para manejar muchas funcionalidades ocultas — por ejemplo, para manejar el sistema de enrutamiento del framework proporcionando diferentes anotaciones correspondientes a cada ruta (@Put(), @Delete(), @Post(), @Get()) para las APIs RESTful Put, Delete, Post y Get respectivamente.

8. Probando la API con Postman

Por último, vamos a probar nuestra recién creada API con Postman. Tenemos que iniciar el servidor de desarrollo para asegurarnos de que todo funciona correctamente antes de desplegarlo en un servidor de producción.

npm run start:dev

Puedes descargar y ejecutar Postman para probar tu API RESTful.

Lista de tareas de Nest.js
Resultado de la lista de tareas de Nest.js

Resumen

Nest.js es un potente framework de Node.js y el framework de typescript más popular de la actualidad.

Proporciona al equipo de ingenieros una arquitectura de desarrollo estándar y las mejores prácticas del sector. Con él, los desarrolladores pueden abstraerse de los repetidos procesos de ingeniería para centrarse únicamente en el desarrollo de la lógica empresarial.

Estas ventajas son las que hacen que marcas populares como Adidas, Roche y otras utilicen el framework para sus aplicaciones de producción empresarial.

En este artículo, hemos establecido una base sólida para Nest.js y por qué tú y tu empresa deberíais considerar el cambio a él. Además, hemos construido una sencilla tarea RESTful para demostrar de forma práctica las maravillas del framework.

Ahora te toca a ti decidir si Nest.js es el framework perfecto para ti.