Integrando MongoDB y NestJS

Integrando MongoDB y NestJS

En los últimos años, el desarrollo de software ha experimentado un cambio significativo en la creación de aplicaciones altamente eficientes, escalables y flexibles. En este contexto, la elección de las herramientas y tecnologías adecuadas juega un papel fundamental en el éxito de un proyecto. Entre las combinaciones que han ganado destaque en la construcción de sistemas modernos, la integración entre NestJS y MongoDB ha emergido como una poderosa aproximación para crear aplicaciones robustas, de alto rendimiento y fácilmente escalables. Así que, en este artículo, aprenderemos todos los pasos para llevar a cabo una integración efectiva de MongoDB en NestJS.

¡Vamos allá!

Node.js

Node.js es un intérprete de JavaScript que se basa en el motor V8. Es ampliamente adoptado por varias empresas de renombre, como PayPal, Amazon y Netflix, debido a su flexibilidad en el soporte de JavaScript tanto del lado del cliente como del servidor.

NestJS es un framework para Node.js, por lo que es esencial tener Node.js configurado en tu máquina para desarrollar con NestJS. Si estás utilizando un sistema operativo Mac o Windows, solo necesitas acceder al sitio web de Node.js, descargar la versión LTS (la versión más actual y estable de Node.js) y completar la instalación utilizando el archivo obtenido. Para usuarios de sistemas Linux, basta con insertar las siguientes líneas de comando en el terminal:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
nvm install lts/*

Si la instalación de Node se completó correctamente en cualquiera de los casos mencionados, al ejecutar el siguiente comando, recibirás en tu terminal la información de la versión de Node instalada:

node --version

MongoDB

MongoDB es un sistema de gestión de bases de datos NoSQL, lo que significa que no sigue la estructura rígida de tablas de las bases de datos relacionales tradicionales. En su lugar, MongoDB adopta un enfoque de almacenamiento de datos basado en documentos, donde los datos se representan en formato de documentos similares a JSON (JavaScript Object Notation). Este tipo de almacenamiento flexible y orientado a documentos hace que MongoDB sea particularmente adecuado para aplicaciones que necesitan manejar grandes volúmenes de datos no estructurados o semiestructurados.

Si no tienes MongoDB instalado en tu entorno de trabajo, puedes descargarlo e instalarlo siguiendo los pasos indicados en el sitio web oficial. Si utilizas Docker, puedes usar el siguiente comando:

docker run --name mongodb -d -p 27017:27017 mongo

NestJS

Como ya se mencionó anteriormente, NestJS es un framework de backend para Node.js que proporciona un conjunto diverso de clases, funciones, tipos y patrones que buscan simplificar la creación de aplicaciones. Desarrollado utilizando TypeScript, un lenguaje derivado de JavaScript que incorpora tipado estático, NestJS ofrece un entorno más seguro y menos propenso a errores. Con NestJS, es posible crear aplicaciones eficientes, escalables y confiables.

NestJS adopta Express como su base, presentando una sintaxis similar a la de Angular. Esta alineación facilita tanto la transición para los desarrolladores que ya están familiarizados con esta tecnología como para aquellos que apenas están comenzando. El enfoque simplificado y fácil de asimilar simplifica considerablemente el proceso de desarrollo.

Si aún no has instalado NestJS en tu máquina y ya completaste el paso previo relacionado con Node.js que mencionamos, basta con ingresar la siguiente línea de comando en tu terminal para realizar la acción:

npm i -g @nestjs/cli

Nota - Utilizamos npm como la herramienta de gestión de paquetes para la instalación y creación de proyectos, pero elige la que prefieras, ya que no afectará en nada nuestro desarrollo, siempre y cuando se instale correctamente. Recuerda también que, en todo momento, es importante tener la documentación a la mano para resolver cualquier duda que pueda surgir.

Una vez que se complete la instalación, crearemos nuestro proyecto en NestJS. En el directorio donde deseas que se almacene tu proyecto, inicializa un terminal y ejecuta el siguiente comando:

nest new commerce

Al ejecutar la línea de código anterior, se te preguntará en el terminal qué gestor de paquetes estás utilizando. Como ya se mencionó, estamos utilizando npm. Si todo sale bien, al completar la instalación y abrir el directorio del proyecto, verás una estructura similar a la de la siguiente imagen:

Figura 1 - Estructura básica de NestJS después de la creación del proyecto

Para realizar la implementación que deseamos, construiremos una aplicación que permita manipular una lista de artículos para la venta. Crearemos un componente de artículos, utilizando el patrón MVC (Model-View-Controller). Utiliza los siguientes comandos en un terminal inicializado en el directorio raíz del proyecto:

nest g module items
nest g service items
nest g controller items

Nota - Si tienes dudas sobre la estructura mencionada, te recomendamos leer el artículo “Utilizando NestJS”, publicado anteriormente. Ahí explicamos la función de cada estructura.

Después de ejecutar las líneas de comando mencionadas (y eliminar los archivos de prueba que no utilizaremos en este proyecto), el directorio “artículos” debería tener una estructura similar a esta:

Figura 2 - Estrutura básica del directorio “items”

Integrando NestJS e MongoDB

Ahora necesitamos realizar la conexión entre ambos, NestJS y MongoDB. Para esto, utilizaremos Mongoose, una biblioteca de JavaScript que se usa para modelar e interactuar con bases de datos MongoDB de una manera más simple y organizada. Ejecuta el siguiente comando para instalarla:

npm i @nestjs/mongoose mongoose

Una vez instalada, utilizaremos la biblioteca en el “AppModule” para utilizar la función “forRoot” que proviene de la clase MongooseModule. Esta función es responsable de realizar la conexión con MongoDB y, por consiguiente, con una base de datos, de acuerdo con la forma en que la estamos utilizando. Como MongoDB se está ejecutando en nuestra máquina local, utilizaremos “localhost” como endpoint:

Figura 3 - Creando la conexión con MongoDB que está en ejecución

Nota que en la línea 8 de la figura 3, “commerce” será el nombre de nuestra base de datos, que se creará en caso de que no se encuentre un Schema con este nombre.

Ahora, crearemos un archivo llamado “Items.model.ts” que contendrá una estructura para la colección que crearemos y una interfaz. Para la primera, crearemos una constante que recibirá la creación de un nuevo Schema (línea 3 de la figura 4), que recibe como parámetro un objeto con la estructura de la colección. Con fines de aprendizaje y para no extender demasiado esta conversación, utilizaremos solo las claves type y required en cada uno de los campos que existirán en la colección:

Figura 4 - Definiendo la estructura del Schema

Nota que la interfaz Items servirá como un contrato, una garantía de que en cualquier implementación de la interfaz “Items” existirán los atributos id, nombre, precio y descripción, con los tipos indicados.

En el módulo de “Items”, definiremos un nombre para la colección y qué datos deberán existir en ella, utilizando la función “forFeature”, que también proviene de “MongooseModule”. Esta función recibe como parámetro una lista de objetos que tienen las claves “name” (conteniendo el nombre de la colección) y “schema” (conteniendo la estructura de la colección, que creamos en la línea 3 de la figura 4, dentro del archivo “items.model.ts”):

Figura 5: Configurando la colección “items”

Creando DTOs

Los DTOs son clases que sirven para definir la estructura de los datos que se transfieren entre diferentes partes de una aplicación. Son muy importantes para la validación y garantía de calidad en nuestro código, además de proporcionar respuestas claras y automatizadas sobre los posibles errores en el llenado de datos.

Para realizar la implementación, primero necesitamos instalar las bibliotecas Class-validator y Class-transformer. Ejecuta la siguiente línea de código en un terminal inicializado en el directorio raíz del proyecto:

npm i class-validator class-transformer

Una vez instalados Class Validator y Class Transformer, declaramos en la main que utilizaremos los métodos de validación que acabamos de instalar, como se muestra en la línea 7 de la figura 6:

Figura 6 - Definiendo el sistema de validaciones recién instalado

Ahora, crearemos nuestro DTO en un archivo llamado “items.dto.ts”, y llamaremos a la clase creada “DataItems”. Observa la implementación a continuación:

Figura 7 - DTO creada para las solicitudes en “Items”

Lo que hicimos en la figura 7 fue habilitar un conjunto de validaciones para el DTO que creamos, validaciones que serán decoradores provenientes de la biblioteca “class-validator”. Existen muchas de ellas, pero utilizaremos las siguientes:

  • @IsNotEmpty() - impide que un determinado atributo esté vacío;
  • @IsNumber() - el atributo en cuestión debe ser del tipo Number;
  • @IsPositive() - el atributo debe ser mayor o igual a 0;
  • @IsString() - el atributo debe ser una cadena de texto;
  • @Length() - define un tamaño mínimo y máximo para el atributo.

Por último, agregamos la clase “DataItems” como tipo de solicitud que esperamos recibir:

Figura 8 - Implementando DTO “DataItems” en el cuerpo de la solicitud recibida

De esta manera, siempre que enviemos una solicitud que no cumpla con los estándares esperados, automáticamente se generará una respuesta explicando por qué la solicitud no es aceptada:

Figura 9 - Respuesta generada por “class-validator” de acuerdo con los decoradores aplicados

Consideraciones finales

En este artículo, aprendimos todo lo necesario para realizar la integración entre MongoDB y NestJS, desde los conceptos más básicos de cada uno de los frameworks y bibliotecas utilizadas, pasando por la instalación de cada uno de ellos y finalizando con una implementación de MongoDB en NestJS. Si te pareció interesante este artículo, tienes alguna duda o simplemente quieres charlar sobre estos y otros temas, también puedes contactarme, ya sea por medio del correo electrónico bruno.cabral.silva2018@gmail.com o por mi perfil de LinkedIn LinkedIn!

¡Te espero con ansias!

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.