En este post, vamos a ver los fundamentos de NestJS y los fundamentos básicos que forman la columna vertebral de este increíble marco. Para entender mejor los fundamentos de NestJS, también haremos un bootstrap de una aplicación de inicio utilizando Nest CLI.
¿Qué es NestJS?
NestJS es un framework para NodeJS para construir aplicaciones del lado del servidor. Es totalmente compatible con Typescript y utiliza elementos de la programación orientada a objetos.
En el fondo, NestJS utiliza marcos de servidores HTTP como Express y Fastify. Aunque NestJS proporciona una capa de abstracción sobre estos marcos NodeJS, expone sus APIs al desarrollador.
Esto ayuda a los desarrolladores a utilizar cualquier paquete de terceros disponible para el marco del servidor subyacente.
Lenguajes soportados por NestJS
El lenguaje principal utilizado para escribir aplicaciones NestJS es Typescript. Sin embargo, dado que NestJS está construido sobre NodeJS, también soporta Javascript.
Debido a la naturaleza flexible de NestJS, es posible utilizar tanto Typescript como Javascript dependiendo de la necesidad y la experiencia del equipo de desarrollo. Sin embargo, los creadores de NestJS recomiendan utilizar Typescript.
🏃🏃 ¿Ya viste el curso de NestJS?
Generación de proyectos NestJS usando Nest CLI
NestJS requiere NodeJS y NPM como requisitos previos. Por lo tanto, asegúrese de que ambos están presentes en tu sistema antes de seguir adelante.
Según la documentación oficial, NestJS requiere una versión de NodeJS superior a la 10.13.
Una vez que NodeJS está instalado, es bastante sencillo arrancar un nuevo proyecto NestJS. Primero tenemos que instalar Nest CLI usando el siguiente comando.
$ npm i -g @nestjs/cli
Aquí, estamos instalando NestJS CLI globalmente. A continuación, podemos utilizar el Nest CLI para crear un nuevo proyecto.
$ nest new demo-project
Este comando creará un directorio llamado demo-project y se instalará node_modules (junto con algunos otros archivos boilerplate). Tendremos un directorio /src con varios archivos del núcleo.
drwxr-xr-x 7 saurabhdashora staff 224 Jul 24 09:46 .
drwxr-xr-x 16 saurabhdashora staff 512 Jul 24 09:50 ..
-rw-r--r-- 1 saurabhdashora staff 617 Jul 24 09:46 app.controller.spec.ts
-rw-r--r-- 1 saurabhdashora staff 274 Jul 24 09:46 app.controller.ts
-rw-r--r-- 1 saurabhdashora staff 249 Jul 24 09:46 app.module.ts
-rw-r--r-- 1 saurabhdashora staff 142 Jul 24 09:46 app.service.ts
-rw-r--r-- 1 saurabhdashora staff 208 Jul 24 09:46 main.ts
Los archivos principales de NestJS
A continuación se presenta un breve resumen de los archivos del núcleo de NestJS:
app.controller.ts This is a minimal controller with a single route
app.controller.spec.ts This file contains the unit tests for the controller
app.module.ts The root module for the application
app.service.ts A basic service with a single method
main.ts The entry file of the application that uses the core NestFactory function. Basically, this is responsible for starting up the application instance.
Veamos el main.ts con más detalle:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
Aquí, en la línea 1, importamos la función NestFactory del paquete @nestjs/core.
El paquete @nestjs/core es el más importante del ecosistema NestJS. Contiene toda la funcionalidad del núcleo de NestJS. Sin el paquete del núcleo de NestJS, otros paquetes de apoyo en NestJS no funcionarán.
El NestFactory expone algunos métodos estáticos. Utilizando el método create(), podemos crear una instancia de la aplicación. Para ello, importamos AppModule
y pasarlo a la llamada create(). Consulta la línea 5
Básicamente, el objeto de aplicación proporciona un conjunto de métodos que podemos utilizar para iniciar nuestro oyente HTTP en el puerto 3000. Esto ocurre en la línea 6. Colocamos todo esto en la función bootstrap().
Finalmente, hacemos una llamada a la función bootstrap() en la línea 8.
Ejecución de la aplicación NestJS
El proyecto andamiaje utilizando el Nest CLI tiene todo lo necesario para iniciar la aplicación. Podemos simplemente iniciar el servidor ejecutando el siguiente comando:
$ npm run start
Deberíamos ver una salida como la siguiente:
> demo-project@0.0.1 start /Users/saurabhdashora/NestProjects/demo-project
> nest start
[Nest] 3640 - 07/24/2021, 10:57:51 AM LOG [NestFactory] Starting Nest application...
[Nest] 3640 - 07/24/2021, 10:57:51 AM LOG [InstanceLoader] AppModule dependencies initialized +26ms
[Nest] 3640 - 07/24/2021, 10:57:51 AM LOG [RoutesResolver] AppController {/}: +6ms
[Nest] 3640 - 07/24/2021, 10:57:51 AM LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 3640 - 07/24/2021, 10:57:51 AM LOG [NestApplication] Nest application successfully
Básicamente, este comando inicia el servidor HTTP escuchando en el puerto definido en el archivo main.ts. En nuestro caso, el puerto es el 3000.
Una vez que la aplicación se está ejecutando, podemos visitar el navegador y pulsar http://localhost:3000. Veremos la impresión de ¡Hola Mundo!
También podemos arrancar nuestra aplicación para estar atentos a los cambios de código para recompilar y recargar automáticamente el servidor utilizando el siguiente comando.
$ npm run start:dev
En caso de que te lo preguntes, estos comandos están definidos en el scripts
sección del package.json
archivo.
"scripts": {
"start": "nest start",
"start:dev": "nest start --watch",
}
Independencia de la plataforma NestJS
NestJS pretende ser agnóstico en cuanto a plataformas. Esto hace posible que los desarrolladores de NestJS escriban una lógica reutilizable. En otras palabras, resulta fácil utilizar la misma lógica en diferentes tipos de aplicaciones.
Técnicamente, NestJS puede funcionar con cualquier marco HTTP de Node una vez que se crea un adaptador. Sin embargo, de entrada, soporta tanto Express como Fastify. Los desarrolladores pueden elegir el que mejor se adapte a sus necesidades.
La plataforma-express o express es la opción por defecto. Es un marco minimalista y probado en la batalla con una plétora de recursos de la comunidad.
La otra opción es platform-fastify. Fastify es un framework de alto rendimiento centrado en la eficiencia.
Ambas plataformas tienen su propia interfaz. Estas se ven respectivamente como NestExpressApplication y NestFastifyApplication.
Podemos configurarlos en la llamada app.create() como se indica a continuación:
import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
await app.listen(3000);
}
bootstrap();
El NestExpressApplication
se importa de @nestjs/platform-express
paquete.
El enfoque anterior expondrá los métodos específicos de NestExpressApplication como parte del objeto app. Sin embargo, a menos que no deseemos acceder a un método específico, no es necesario especificar un tipo.
Para trabajar con Fastify, tenemos que instalar el platform-fastify
paquete.
$ npm install --save @nestjs/platform-fastify
Una vez realizada la instalación, debemos habilitar FastifyAdapter
dentro del main.ts
en el momento de arrancar la aplicación NestJS.
import { NestFactory } from '@nestjs/core';
import {
FastifyAdapter,
NestFastifyApplication,
} from '@nestjs/platform-fastify';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter()
);
await app.listen(3000, '0.0.0.0');
}
bootstrap();
Como puede ver, pasamos el NestFastifyApplication
al tipo NestFactory.create() método. Además, el create()
toma un valor adicional de como entrada - una instancia de FastifyAdapter
clase.
Por defecto, Fastify escucha en localhost 127.0.0.1
solamente. Por lo tanto, para aceptar conexiones en otros hosts, especificamos 0.0.0.0 en el listen
() llamada al método.
Conclusión
Con esto, hemos visto con éxito los fundamentos de NestJS y los fundamentos del núcleo.
Hemos instalado Nest CLI seguido por el bootstrapping de nuestro primer proyecto. Además, hemos explorado los archivos de inicio y su propósito junto con una atención especial al archivo main.ts que es responsable de iniciar nuestra aplicación.
Ahora, estamos listos para dar los siguientes pasos en la exploración de más en NestJS.