¿Por qué NestJS es uno de los mejores frameworks para Node?

¿Por qué NestJS es uno de los mejores frameworks para Node?

La comunidad Javascript es una de las más grandes de desarrollo en todo el mundo, por lo que no es de extrañarse que continúe siendo uno de los lenguajes más utilizados cada año.

Ya sea que estés desarrollando para Backend, tienes muchas opciones para escoger. Si quieres hacer backend, la opción más popular entre muchos desarrolladores es ExpressJS. Sólo necesitas instalar un par de librerías en tu package.json y ya puedes comenzar a crear tu API o vistas que retornen HTML desde el servidor.

Entonces, al leer el título te preguntarás: ¿Por qué prefiero NestJS, si hay otras opciones más populares como Express o Hapi?

Aquí te daré algunas razones por las cuales he trabajado en algunos proyectos con NestJS y por qué volvería a usarlo.

Es NodeJS (Javascript)

Todos conocemos las ventajas que ofrece NodeJS como framework para Backend, tales como velocidad de ejecución y la suave curva de aprendizaje para las personas que vienen del Frontend.

NodeJs se ha consagrado como una de las tecnologías más utilizadas para desarrollar backend en los últimos años, ya que los programadores frontend en Javascript se sienten más cómodos trabajando en el backend con un lenguaje que ya conocen.

Terminal window
# Instalando NestJS globalmente
npm i -g @nestjs/cli
# Creando un proyecto nuevo
nest new project-name

Recomienda, pero no obliga, un orden establecido para trabajar

Y me recuerda mucho a Laravel (PHP).

Me explico, la organización de las carpetas se parece mucho a Angular, no te obliga a ordenar tu código como podrías ver en los tutoriales. Pero he descubierto que una cierta manera de organizar los archivos es una combinación de cualquier framework MVC + Angular. Para cualquier persona que haya trabajado en otro framework Backend que no sea ExpressJS, se sentirá más cómoda haciendo la transición a Nest.

user.controller.ts
// Un controlador REST común en NestJS
@Controller("users")
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.usersService.create(createUserDto);
}
@Get()
findAll() {
return this.usersService.findAll();
}
@Get(":id")
findOne(@Param("id") id: string) {
return this.usersService.findOne(+id);
}
@Patch(":id")
update(@Param("id") id: string, @Body() updateUserDto: UpdateUserDto) {
return this.usersService.update(+id, updateUserDto);
}
@Delete(":id")
remove(@Param("id") id: string) {
return this.usersService.remove(+id);
}
}

Bases de datos y ORMs

NestJS funciona muy bien con casi todos los motores de base de datos más populares. Ya sea MySQL, PostgreSQL, MongoDB, etc.

Viene además con soporte para distintos ORM, como TypeORM, Sequelize, MikroORM, Prisma, etc.

Las tablas o esquemas de la base de datos se pueden crear con Typescript, lo cual es muy útil para evitar errores de síntaxis.

photo.ts
// Un modelo de la base de datos usando TypeORM con Typescript
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 500 })
name: string;
@Column("text")
description: string;
@Column()
filename: string;
@Column("int")
views: number;
@Column()
isPublished: boolean;
}

Soporte para Typescript

Desde 2020, el número de desarrolladores que utilizan Typescript ha ido en aumento. Creo que esto se debe a la envergadura de los proyectos actuales y a la popularidad del frontend. Dado que hay muchos datos que conectar entre ambos lados del desarrollo: Backend y Frontend, es necesario promover ciertos estándares para evitar que los nuevos integrantes de un equipo se confundan acerca del tipo de variables o funciones que se deben utilizar en todo el proyecto. Es aquí donde Typescript resulta muy útil. Además, no debemos olvidar que el soporte de autocompletado, según tu editor, es mucho más intuitivo.

Cuando NestJS utiliza Typescript, la facilidad para escribir código aumenta considerablemente y, al mismo tiempo, se reducen los errores en los tipos de datos antes de la compilación.

Documentación

Lo que más me encanta de un framework es la documentación y los ejemplos que se presentan en su sitio web. Una mala documentación es una de las principales razones por las que un desarrollador junior a medio no se siente tan motivado para trabajar con un framework web y, por lo tanto, evita su uso. Creo que en este punto, NestJS cumple con este requisito. Es una de las mejores documentaciones de framework backend que he visto, al nivel de otros proyectos como Laravel.

Entornos de desarrollo veloces con SWC

NestJS tiene soporte para SWC , un entorno de compilación hecho en Rust, que puede incrementar la velocidad de compilación de Typescript hasta 20 veces más rápido que el compilador de Typescript por defecto.

Soporte para aplicaciones en microservicios o serverless

NestJS no solo está hecho para ser desplegado en cualquier servidor VPS. También ofrece soporte para desplegarse en contenedores y aprovechar la arquitectura de microservicios.

Incluso soporta el protocolo RPC, que es muy útil para la comunicación entre microservicios. Utiliza la biblioteca gRPC.

Además, si deseas desplegar tu aplicación en un proveedor de serverless como AWS Lambda, sin necesidad de cargar todas las bibliotecas que el framework trae por defecto, NestJS te lo permite.

// Ejemplo de como levantamos una app en modo RPC
const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
transport: Transport.GRPC,
options: {
package: "hero",
protoPath: join(__dirname, "hero/hero.proto"),
},
});

Websockets

Si necesitas conexiones en tiempo real para tu aplicación, NestJS te permite hacerlo con Websockets. Soporta respuestas asíncronas, múltiples respuestas, etc.

Soporte OpenAPI con Swagger

Si necesitas documentar tu API, NestJS puede conectarse a Swagger. Swagger además te permite probar tus endpoint directamente desde el navegador sin el uso de una herramienta para testing de API como Postman.

Es también útil para compartir los endpoint con otros equipos de trabajo.

main.ts
// Agregando swagger a tu aplicación
import { NestFactory } from "@nestjs/core";
import { SwaggerModule, DocumentBuilder } from "@nestjs/swagger";
import { AppModule } from "./app.module";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const config = new DocumentBuilder()
.setTitle("Gatos API")
.setDescription("Descripción de la API de gatos")
.setVersion("1.0")
.addTag("gatos")
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup("api", app, document);
await app.listen(3000);
}
bootstrap();

Soporte GraphQL

Si necesitas integrar GraphQL, NestJS tiene pasos sencillos para hacerlo. Sólo recuerda que en este modo, necesitas dejar de lado los controladores REST y usar los resolvers de GraphQL.

app.module.ts
import { Module } from "@nestjs/common";
import { GraphQLModule } from "@nestjs/graphql";
import { ApolloDriver, ApolloDriverConfig } from "@nestjs/apollo";
@Module({
imports: [
GraphQLModule.forRoot<ApolloDriverConfig>({
driver: ApolloDriver,
}),
],
})
export class AppModule {}

Devtools

Nest agregó recientemente una herramienta para desarrolladores que permite ver la organización de tu aplicación en tiempo real. Puedes ver como tus módulos y servicios están conectados entre sí y evitar las dependencias circulares.

app.module.ts
@Module({
imports: [
DevtoolsModule.register({
http: process.env.NODE_ENV !== "production",
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

Organización de tareas (Crons)

Cuando se necesiten ejecutar tareas en segundo plano, no necesitas tener un cronjob en tu servidor. NestJS te permite hacerlo con un decorador.

Esta característica es útil si necesitas realizar tareas automáticas, como enviar un correo electrónico cada ciertas horas, o actualizar la información en la base de datos en algún momento del día.

tasks.service.ts
import { Injectable, Logger } from "@nestjs/common";
import { Cron } from "@nestjs/schedule";
@Injectable()
export class TasksService {
private readonly logger = new Logger(TasksService.name);
@Cron("45 * * * * *")
handleCron() {
this.logger.debug("Llamado cuando el segundo es 45");
}
}

Caché

Si no deseas realizar una consulta a la base de datos para obtener fragmentos de información que no cambian con frecuencia, NestJS permite agregar caché a tu aplicación.

No solo añade caché a los endpoints REST, sino también a patrones como Websockets y Microservicios.

app.controller.ts
@Controller()
export class AppController {
@CacheKey("llave_personalizada")
@CacheTTL(20)
findAll(): string[] {
return [];
}
}

Encriptación y hashing

Cuando se necesita intercambiar datos entre diferentes microservicios o partes de la aplicación, es importante considerar la seguridad de la información, ya que puede ser interceptada. En NestJS, puedes cifrar los datos para asegurar su confidencialidad.

NestJS utiliza la biblioteca nativa de criptografía de NodeJS, llamada crypto.

app.service.ts
// Ejemplo de encriptación
import { createCipheriv, randomBytes, scrypt } from "crypto";
import { promisify } from "util";
const iv = randomBytes(16);
const password = "Contraseña usada para generar la llave";
const key = (await promisify(scrypt)(password, "salt", 32)) as Buffer;
const cipher = createCipheriv("aes-256-ctr", key, iv);
const textToEncrypt = "Nest";
const encryptedText = Buffer.concat([cipher.update(textToEncrypt), cipher.final()]);

Y muchas características más

NestJS tiene muchas más características que no he mencionado en este artículo. Haré un rápido listado de otras características que podrías encontrar útiles:

  • Sesiones
  • Protección contra ataques de CSRF
  • Pipes
  • Creación de aplicaciones CLI
  • Healthchecks
  • Soporte NATS, MQTT, Kafka, RabbitMQ, etc.

Conclusión

Estas son, creo yo, las razones principales por las cuales, en cualquier nuevo proyecto que requiera Node para el Backend, yo usaría NestJS sin ninguna duda. Por supuesto, hay más features que simplifican el trabajo en el backend. Todo eso te invito a que lo descubras en su documentación .

Mis posts no son generados por la IA, sin embargo, podrían estar corregidos por ella. El primer borrador siempre es de mi creación

Tags

Autor

Escrito por Helmer Davila

En otros lenguajes

E por que o usaria para o meu próximo projeto

Por que NestJS é um dos melhores frameworks backends do NodeJS?

And why I would choose it for my next project

Why Nest JS is one of the best Node backend frameworks?

J’ai travaillé en NestJS et pourquoi je le ferais encore.

Pourquoi NestJs est l'un des meilleurs frameworks pour Node?

Posts relacionados

Usando TypeORM y NestJS

TypeORM: Búsqueda relacional (NestJS incluido)