Integrando MongoDB e NestJS

Integrando MongoDB e NestJS

Nos últimos anos, o cenário de desenvolvimento de software testemunhou uma mudança significativa na criação de aplicativos altamente eficientes, escaláveis e flexíveis. Nesse contexto, a escolha das ferramentas e tecnologias certas desempenha um papel fundamental no sucesso de um projeto. Entre as combinações que têm ganhado destaque na construção de sistemas modernos, a integração entre o NestJS e o MongoDB emergiu como uma abordagem poderosa para criar aplicações robustas, de alto desempenho e facilmente escaláveis. Dessa forma, aprenderemos neste artigo todos os passos para realizar uma integração eficaz entre o MongoDB no NestJS.

Vamos lá?

Node.js

O Node.js é um interpretador de JavaScript que se baseia no mecanismo V8. Ele é amplamente adotado por várias empresas de renome, como Paypal, Amazon e Netflix, devido à sua flexibilidade no suporte ao JavaScript tanto no cliente quanto no servidor.

O NestJS é um framework para o Node.js, sendo essencial configurar o último em sua máquina para o desenvolvimento com o primeiro. Se você estiver utilizando um sistema operacional Mac ou Windows, basta acessar o site do Node, fazer o download da versão LTS (versão mais atual e estável do Node.js) e concluir a instalação usando o arquivo obtido. Para usuários do sistema Linux, basta inserir as seguintes linhas de comando no terminal:

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

Se a instalação do Node foi concluída corretamente para qualquer um dos casos citados, ao executarmos o comando abaixo, receberemos como informação no nosso terminal a versão do Node instalada:

node --version

MongoDB

O MongoDB é um sistema de gerenciamento de banco de dados NoSQL, o que significa que ele não segue a estrutura de tabelas rígida dos bancos de dados relacionais tradicionais. Em vez disso, o MongoDB adota uma abordagem de armazenamento de dados baseada em documentos, onde os dados são representados em formato de documentos semelhantes a JSON (JavaScript Object Notation). Esse tipo de armazenamento flexível e orientado a documentos torna o MongoDB particularmente adequado para aplicações que precisam lidar com grandes volumes de dados não estruturados ou semiestruturados.

Caso você não possua o MongoDB no seu terminal de trabalho, você pode realizar o download e a instalação seguindo o passo a passo existente no site. Caso você utilize o docker, pode utilizar o seguinte comando:

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

NestJS

Como já foi mencionado anteriormente, o NestJS é um framework de backend para Node.js que fornece um conjunto diversificado de classes, funções, tipos e padrões que visam simplificar a elaboração de aplicações. Desenvolvido utilizando TypeScript, uma linguagem derivada do JavaScript que incorpora tipagem estática, ele oferece um ambiente mais seguro e menos suscetível a erros. Com o NestJS, é possível criar aplicações eficientes, escaláveis e confiáveis.

O NestJS adota o Express como sua base, apresentando uma sintaxe que se assemelha ao Angular. Esse alinhamento facilita tanto a transição para os desenvolvedores que já estão familiarizados com a tecnologia mencionada quanto para aqueles que estão chegando. A abordagem simplificada e de fácil assimilação simplifica consideravelmente o processo de desenvolvimento.

Caso o NestJS ainda não esteja instalado em sua máquina e você já tenha executado o passo prévio relacionado ao Node.js que citamos, basta inserir a seguinte linha de comando em seu terminal para realizar a ação:

npm i -g @nestjs/cli

OBS - Utilizamos para a instalação e criação de projetos o npm como ferramenta de gerenciamento de pacotes, mas escolha qual você achar melhor, visto que em nada irá atrapalhar no nosso desenvolvimento, contanto que seja instalado corretamente. Lembre-se também que, a todo momento, é importante andar com a documentação debaixo do braço, para tirar qualquer dúvida que possa aparecer!

Uma vez concluída a instalação, iremos criar o nosso projeto NestJS. No diretório onde você deseja que fique armazenado o seu projeto, inicialize um terminal e execute o comando a seguir:

nest new commerce

Ao executar a linha de código acima, será questionado no próprio terminal qual o gerenciador de pacotes que estamos utilizando. Como já foi dito, estamos utilizando o npm. Se tudo der certo, ao concluir a instalação e abrir o diretório do projeto, você verá uma estrutura semelhante a da imagem abaixo:

Figura 1 - Estrutura básica do NestJS após a criação do projeto

Para realizar a implementação que desejamos, iremos construir uma aplicação que seja possível manipular uma lista de itens para venda. Criaremos um componente items, utilizando o padrão MVC (Model-View-Controller). Utilize os seguintes comandos em um terminal inicializado no diretório raiz do projeto:

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

OBS - Se você possui dúvidas sobre a estrutura mencionada, recomendamos que leia o artigo “Utilizando o NestJS”, publicado anteriormente. Lá explicamos a função de cada estrutura.

Após a execução das linhas de comando supracitadas (e removendo os arquivos para testes que não utilizaremos neste projeto), o diretório “items” deve ter uma estrutura parecida com essa:

Figura 2 - Estrutura básica do diretório “items”

Integrando NestJS e MongoDB

Precisamos agora realizar a conexão entre ambos, NestJS e MongoDB. Para isto, utilizaremos o Mongoose, uma biblioteca JavaScript utilizada para modelar e interagir com bancos de dados MongoDB de forma mais simples e organizada. Execute o comando a seguir para realizar a instalação do mesmo:

npm i @nestjs/mongoose mongoose

Uma vez instalado, utilizaremos a biblioteca no “AppModule”, para utilizar a função “forRoot” que vem da classe MongooseModule. Esta função é responsável por realizar a conexão com o MongoDB e consequentemente um banco de dados, de acordo com a forma como estamos utilizando. Como o MongoDB está sendo executado na nossa máquina local, utilizaremos o “localhost” como endpoint:

Figura 3 - Criando a conexão com o MongoDB que está em execução

Note na linha 8 da figura 3 que “commerce” será o nome do nosso banco de dados, que será criado caso não seja encontrado um Schema com este nome.

Agora, criaremos um arquivo chamado “Items.model.ts” que conterá uma estrutura para a coleção que criaremos e uma interface. Para a primeira, criaremos uma constante que receberá a criação de um novo Schema (linha 3 da figura 4), que recebe como parâmetro um objeto com a estrutura da coleção. Para fins de aprendizado e para não estender demais da conta esta nossa conversa, utilizaremos apenas as chaves type e required em cada um dos campos que existirão na coleção:

Figura 4 - Definindo a estrutura do Schema

Note que a interface Items servirá como um contrato, uma garantia que em qualquer implementação da interface “Items” existirão os atributos id, nome, preço e descrição, com os tipos indicados.

Na Module de “Items”, definiremos um nome para a coleção e quais dados deverão existir nela, utilizando a função “forFeature”, advinda também de “MongooseModule”. Esta função recebe como parâmetro uma lista de objetos que possuem as chaves “name” (contendo o nome da coleção) e “schema” (contendo a estrutura da coleção, que criamos na linha 3 da figura 4, dentro do arquivo “items.model.ts”):

Figura 5: Configurando a coleção “items”

Criando DTOs

As DTOs são classes que servem para definir a estrutura dos dados que são transferidos entre diferentes partes de uma aplicação. Elas são muito importantes para validação e garantia de qualidade no nosso código, além de apresentar respostas claras e automatizadas sobre os possíveis erros de preenchimento dos dados.

Para realizar a implementação, precisamos primeiro instalar as bibliotecas Class-validator e o Class-transformer. Execute a seguinte linha de código em um terminal inicializado no diretório raiz do projeto:

npm i class-validator class-transformer

Uma vez instalados o Class Validator e o Class Transformer, declaramos na main que iremos utilizar os métodos de validações que acabamos de instalar, vide linha 7 da figura 6:

Figura 6 - Definindo o sistema de validações recém-instalado

Agora, criaremos a nossa DTO em um arquivo chamado “items.dto.ts”, da qual chamaremos a classe criada de “DataItems”. Observe a implementação abaixo:

Figura 7 - DTO criada para a requisições em “Items”

O que fizemos na figura 7 foi habilitar um conjunto de validações para a DTO que criamos, validações estas que serão decorators advindas da biblioteca “class-validator”. Existem inúmeras delas, mas utilizaremos as seguintes:

  • @IsNotEmpty() - impede que um determinado atributo seja vazio;
  • @IsNumber() - o atributo em questão precisa ser do tipo Number;
  • @IsPositive() - o atributo precisa ser maior ou igual a 0;
  • @IsString() - necessário que o atributo seja uma string;
  • @Length() - define um tamanho mínimo e máximo para o atributo.

Por fim, adicionamos a classe “DataItems” como tipo de requisição que esperamos receber:

Figura 8 - Implementando DTO “DataItems” no corpo da requisição recebido

Desta forma, sempre que enviamos uma requisição que não corresponda aos padrões esperados, automaticamente é gerada uma resposta explicando o porquê da requisição não ser aceita:

Figura 9 - Resposta gerada pelo “class-validator” de acordo com os decorators aplicados

Considerações finais

Neste artigo, aprendemos tudo o que é necessário para realizar a integração entre o MongoDB e o NestJS, desde os conceitos mais básicos de cada um dos frameworks e bibliotecas utilizadas, passando pela instalação de cada um deles e finalizando com uma implementação via NestJS do MongoDB. Se você achou esse artigo interessante, gostaria de tirar quaisquer dúvidas ou somente está afim de trocar uma ideia sobre esses e mais assuntos, você também pode entrar em contato comigo, seja por meio do e-mail bruno.cabral.silva2018@gmail.com ou pelo meu perfil do Linkedin!

Te espero ansiosamente!

💡
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.