Introducción a Nest.js: cuanto más alto
Por Matthew Tyson
Arquitecto de software, InfoWorld |
Nest.js, que no debe confundirse con Next.js, es un enfoque más nuevo y único para la tecnología de servidor JavaScript. Se necesita un servidor familiar como Express o Fastify y capas de una serie de abstracciones útiles, que están orientadas a potenciar y simplificar el diseño de aplicaciones de nivel superior. Gracias a su combinación distintiva de paradigmas de programación, compatibilidad con TypeScript de primer orden y funciones integradas como la inyección de dependencia, Nest.js ha ganado popularidad de manera constante en los últimos años.
Nest.js es una contribución interesante al ecosistema de JavaScript y bien merece su atención. Es una gran herramienta a tener en cuenta cuando se trabaja con JavaScript y TypeScript del lado del servidor.
En este artículo, haremos un recorrido relámpago por Nest.js, con ejemplos que incluyen enrutamiento, controladores, productores (inyección de dependencia) y autenticación con guardias. También comprenderá el sistema de módulos Nest.js.
Nuestro ejemplo es una aplicación utilizada para gestionar una lista de recetas de pasta. Incluiremos un servicio de inyección de dependencia que administra el conjunto de datos real y una API RESTful que podemos usar para enumerar todas las recetas o recuperar una sola receta por ID. También configuraremos un punto final PUT autenticado simple para agregar nuevas recetas.
Comencemos armando un nuevo proyecto. Una vez que tengamos eso, podemos sumergirnos en los ejemplos.
Podemos usar la interfaz de línea de comandos de Nest.js para configurar un diseño rápido de la aplicación, comenzando por instalar Nest globalmente con: $ npm install -g @nestjs/cli. Además del comando crear, nestjs incluye funciones útiles como generar para compartir diseños reutilizables. La instalación global nos da acceso a eso y más.
Ahora podemos crear una nueva aplicación con: $ nest new iw-nest. Puede seleccionar el administrador de paquetes que desee (npm, Yarn o pnpm). Para esta demostración, usaré pnpm. El proceso es el mismo independientemente.
Cambie al nuevo directorio /iw-nest e inicie el servidor de desarrollo con: $ pnpm run start. Puede verificar que la aplicación se esté ejecutando visitando localhost:3000, donde debería ver un mensaje "¡Hola, mundo!". mensaje. Este mensaje proviene de iw-nest/src/app.controller.ts. Si observa ese archivo, puede ver que está utilizando un servicio inyectado. Creemos un nuevo controlador (src/recipes.controller.ts) que devuelva una lista de recetas, como se muestra en el Listado 1.
El Listado 1 nos da un vistazo a los conceptos básicos del enrutamiento en Nest.js. Puede ver que usamos la anotación @Controller('recipes') para definir la clase como un controlador con la ruta de /recipes. El método getRecipes() está anotado para manejar el método GET con @Get().
Por ahora, este controlador simplemente asigna el GET /recipes a una cadena de respuesta codificada. Antes de que Nest.js sirva esto, debemos registrar el nuevo controlador con el módulo. Los módulos son otro concepto importante en Nest y se utilizan para ayudar a organizar el código de su aplicación. En nuestro caso, necesitamos abrir /src/app.module.ts y agregar el controlador, como se muestra en el Listado 2.
El marco de inyección de dependencia en Nest.js recuerda a Spring en el ecosistema Java. Tener la inyección de dependencia incorporada por sí sola hace que valga la pena considerar Nest.js, incluso sin sus otras comodidades.
Definiremos un proveedor de servicios y lo conectaremos a nuestro controlador. Esta es una forma limpia de mantener la aplicación organizada en capas. Puede ver nuestra nueva clase de servicio, /src/recipes.service.ts, en el Listado 3.
Para utilizar este proveedor de servicios, también debemos agregarlo al archivo app.module.ts, como se muestra en el Listado 4.
Los módulos son una buena forma de organizar una aplicación. Pueden actuar como un mecanismo de agrupación lógico, proporcionando una estructura jerárquica donde los módulos más fundamentales están claramente definidos y los demás dependen de ellos.
Ahora podemos usar el servicio en RecipesController, como se muestra en el Listado 5. Si es nuevo en la inyección de dependencias, esto puede parecerle mucho trabajo adicional. Pero la capacidad de definir y consumir clases en toda la aplicación, de forma estandarizada, puede ser una verdadera ayuda para la arquitectura de su aplicación a medida que el sistema crece.
Básicamente, importamos la clase RecipesService y luego, para obtener una referencia, usamos la anotación @Inject() en el miembro RecipesService. El sistema de inyección conectará esto a una instancia de la clase RecipesService, según el tipo. De forma predeterminada, los servicios inyectados son únicos en Nest, por lo que todas las clases de clientes obtendrán la referencia a la misma instancia. Es posible utilizar otros “ámbitos” de servicios para ajustar cómo se crean instancias. Además de la inyección de constructores, Nest admite la inyección basada en propiedades.
Ahora, si ejecuta la aplicación y va a localhost:3000/recipes, verá la salida JSON de la matriz de recetas en el servicio.
Ahora, agreguemos un nuevo punto final POST para permitir a los usuarios agregar recetas. Lo protegeremos con la autenticación más simple posible usando lo que se llama guardia en Nest.js. Un guardia se sienta frente a los controladores y determina cómo se enrutan las solicitudes. Puede ver nuestra guardia simple en el Listado 6. En este momento, solo verifica si hay un encabezado de autenticación en la solicitud.
Luego, registre el guardia con el módulo, como se muestra en el Listado 7.
Ahora podemos usar el nuevo servicio de protección para proteger nuestro punto final POST, que se muestra en el Listado 8. Tenga en cuenta las nuevas importaciones.
Observe que la anotación @UserGuards se usó para aplicar la nueva protección al método addRecipe(), que también se especifica como un punto final POST con la anotación @Post. Nest se encargará de crear instancias y aplicar la protección al punto final por nosotros.
También agregamos un método addRecipe() al servicio, que es muy simple, como se muestra en el Listado 9.
Ahora podemos probar la autenticación y el punto final con un par de solicitudes CURL, como en el Listado 10.
Puede ver que la autorización está funcionando, ya que solo se permite el paso de una solicitud que contenga el encabezado Portador.
Hasta ahora, hemos utilizado sólo un objeto JavaScript. En el mundo TypeScript, sería común crear un objeto modelo Receta y usarlo como un objeto de valor para desplazarse por la información. Por ejemplo, podríamos crear la clase Recipe (Listado 11) y usarla en el método addRecipe (Listado 12).
Finalmente, puede hacer que el método POST addRecipe() esté fuertemente tipado y Next completará automáticamente el objeto modelo para nosotros:
Luego puede hacer que el método POST addRecipe() esté fuertemente tipado y Nest completará automáticamente el objeto modelo por nosotros, como se muestra en el Listado 13.
La elección entre la flexibilidad de la escritura pato de JavaScript y la escritura fuerte de TypeScript realmente depende de lo que usted, el equipo o la organización decidan utilizar. JavaScript le brinda velocidad de desarrollo y flexibilidad, mientras que TypeScript le brinda estructura y más soporte de herramientas.
También vale la pena señalar que Nest.js adopta la programación reactiva y puede devolver promesas desde métodos y puntos finales. Aún más, puedes devolver un RxJS Observable. Esto le brinda potentes opciones para conectar aplicaciones junto con flujos de datos asíncronos.
Aunque solo hemos arañado la superficie de lo que puede hacer, está claro que Nest.js es una plataforma capaz y bien pensada para construir servidores Node. Cumple la promesa de una capa de nivel superior además de Express para mejorar la arquitectura y el soporte de diseño. Si está buscando crear JavaScript del lado del servidor y especialmente aplicaciones TypeScript, Nest es una excelente opción.
A continuación lee esto:
Matthew Tyson es fundador de Dark Horse Group, Inc. Cree en la tecnología que da prioridad a las personas. Cuando no toca la guitarra, Matt explora el interior del país y el interior filosófico. Ha escrito para JavaWorld e InfoWorld desde 2007.
Copyright © 2023 IDG Communications, Inc.
A continuación lee esto: