ORM no NodeJS com TypeORM

Como desenvolver uma API elegante com NodeJS — parte 3

Matheus Bessa
4 min readMay 23, 2020

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 🤣)

  1. Instale o typeorm e o reflect-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:

Bacana né?

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…

--

--