ORM no NodeJS com TypeORM
Como desenvolver uma API elegante com NodeJS — parte 3
Na teoria 📚👨🏻🎓👩🏼🎓
Este artigo faz parte de uma série de artigos no qual eu explico a aplicação de boas práticas em uma API Node utilizando Programação Orientado a Objetos. E como em tudo em tecnologia, quando incluímos um paradigma, ou framework, com o intuito de resolver um problema, nós também trazemos os problemas do paradigma/framework importado.
E dentro de qualquer aplicação Orientada a Objetos que lida com uma Base de Dados Relacional, existe um problema de distanciamento de paradigmas entre as duas frentes. Isso em grande escala torna a aplicação suscetível a inconsistências em relação a base de dados, ou vice e versa. Além disso, em aplicações que passam por constantes alterações na base dados, que podem ser aquelas que estão no início de desenvolvimento.
E então veio o ORM…
Devido a esse distanciamento de paradigmas entre a Aplicação OOP e a Base de Dados Relacional, surgiu conceito de ORM, Object-Relational Mapping, que atua como um intermediador entre as duas frentes, mapeando os objetos e entidades da Aplicação para a Base de Dados, ou vice e versa.
Hoje esse padrão é bem disseminado dentro do mercado, e em qualquer linguagem é possível encontrar um framework que ajuda na implementação de um ORM para sua aplicação.
Porém vamos falar sobre o TypeORM, que é um ORM Node, focado em Typescript, que tem criado bastante espaço no mercado Javascript.
Sem delongas, bora lá…
Na prática ⚡👨🏻💻👩🏼💻
Para construir os nossos exemplos eu vou utilizar o CLI do TypeORM para implementação inicial.
Instalando (literalmente um ctrl+c e ctrl+v da doc oficial 🤣)
- Instale o
typeorm
e oreflect-metadata
pelo npm:
npm install typeorm reflect-metadata --save
2. É importante que o reflect-metadata
seja importado no arquivo main da aplicação Node (aqui nesse exemplo será app.ts
):
import "reflect-metadata";
3. Você vai precisar instalar as tipagens do Node:
npm install @types/node --save
4. Instale o driver da base de dados que irá utilizar. (aqui usarei o Postgre como exemplo)
npm install pg --save
5. Configuração Typescript
- Certifique que o seu Typescript é igual ou superior a versão 3.3
- Habilite o
"emitDecoratorMetadata":true
e o"experimentalDecorators":true
no tsconfig.json - Habilitar o
es6
na seção de compilador do seu tsconfig.json
Primeiros Passos
Para usarmos o CLI do Typeorm, é necessário que o instalemos globalmente em nossas máquinas:
npm install typeorm --global
E para criar uma Aplicação do zero, com Express e Postgre com o CLI do TypeORM, basta executar o seguinte comando:
typeorm init --name 03-typeorm-example --database postgres --express
Simples!
Vejamos o resultado:
E também vejamos como ficou isso na nossa base de dados:
Um teste extra
Quando se desenvolve uma aplicação que acesse uma base relacional, é importante que o desenvolvedor realize uma gestão correta das conexões que a aplicação realizará com a base de dados, senão as suas conexões podem não ser estabelecidas após atingir uma certa quantidade de conexões, e por consequência sua aplicação ficará intermitente.
Por padrão o Postgre tem uma limitação de até 100 conexões simultâneas na base, podendo obviamente ser configurado para receber mais conexões.
Eu fiz um script básico que vai stressar a nossa respectiva aplicação com 5000 requests, com o intuito certificar que um ORM também é capaz de abstrair esse tipo de problema sem que o desenvolvedor se preocupe em implementar.
Segue script:
#!/bin/bash# Esse bash é um pequeno teste de Stress que comprova a gestão correta de conexões do TypeORM.CONTADOR=0while [ $CONTADOR -lt 5000 ]; doecho “\n Chamada N. $CONTADOR”;curl http://localhost:3000/userslet CONTADOR=CONTADOR+1;done
E sua execução sem nenhuma intermitência:
Migrations
Durante a vida de uma aplicação, e principalmente durante o seu momento inicial de desenvolvimento, é muito comum ter o surgimento de demandas de migração da base de dados com a aplicação para que ambas estruturas estejam sincronizadas. Esse processo feito de forma manual, depende de uma comunicação estreita com a equipe de desenvolvimento para que não haja desencontros.
E uma das estratégias que muitos ORM’s oferecem, para aperfeiçoar esse processo, é o uso de migrations. No TypeORM isso é possível através do seu CLI.
Vamos a um exemplo rápido:
Conclusão
Dentro de um desenvolvimento de software que trabalha com uma base relacional, é sempre interessante considerar o uso de um ORM para abstrair o mapeamento de objetos de aplicação vs objetos de base de dados.
Mas aconselho que realize diagnósticos periódicos a fim de analizar como o ORM está lidando com a base. Porque convenhamos, o nível de abstração dessa abordagem é relativamente alta, mas não significa que você não deva saber o que rola por debaixo dos panos. Certifique a gestão de conexões, construção de queries, uso ou não uso de cache, e etc.
Saiba o que rola por de baixo dos panos.
Bom é isso aí!!! Espero que tenham gostado. E no proximo artigo tratarei sobre o TypeORM + Inversify e suas vantagens.
Vlw Flws…