🚀Implementando uma rest-api com NestJS⚡ usando o prisma na sua mais recente versão, a versão 4 ⚠️

Estevam Souza
16 min readOct 10, 2022

--

Introdução ao Nestjs com prisma4 …

Neste post, vamos aprender a construir uma API NestJS Prisma REST do zero. Ao contrário de muitos outros posts sobre o tema, vamos começar com o básico do Prisma e também suas vantagens. Assim que cobrirmos o essencial, montaremos nosso projeto de forma passo a passo. Isso nos ajudará a construir um tutorial abrangente do NestJS Prisma que pode ajudá-lo a começar com o Prisma ORM em seus próprios projetos com facilidade.

NestJS é uma estrutura para criar aplicativos de node escalável, ao lado do servidor. Ele usa JavaScript moderno e combina elementos de programação reativa orientada a objetos.

A documentação nestjs é ótima na maior parte do tempo, mas tem algumas omissões importantes na seção de vários bancos de dados.

Ele adota o TypeScript para evitar erros de tempo de execução e melhorar a produtividade. O tipo de segurança que ele fornece vai muito além das garantias de ORMs tradicionais como TypeORM ou Sequelize

O Prisma 4 introduz uma série de mudanças de quebra quando você atualiza de uma versão anterior do Prisma.

Recomendamos que você primeiro aborde quaisquer erros de validação do esquema do Prisma e, em seguida, puxe seu banco de dados para refletir novos recursos de esquema do Prisma e, finalmente, corrija quaisquer erros de tipo no cliente e valide executando seu conjunto de testes.

Este post demonstrará como usar o Nest e o Prisma para construir uma API REST. Eis o que vamos cobrir:

  • O que é Prisma
  • Padrões da lista Scalar
  • Mudanças gerais
  • Prisma usado para
  • Configuração inicial do projeto
  • Começando com prisma
  • Conectando-se a um banco de dados
  • Criando o esquema do banco de dados
  • Criação do Prisma Client e Prisma Service
  • Gerando um módulo todo
  • Testando nossa aplicação
  • Mudanças de esquema
  • REST API
  • Por que Prisma e NestJS?
  • Resumo

O que é Prisma?

Prisma é um mapeador objeto-relacional de objetos (ORM) de última geração. Ele fornece um kit de ferramentas de banco de dados de código aberto para PostgreSQL, MySQL, SQL Server, SQLite e MongoDB (atualmente em pré-visualização), permitindo que os desenvolvedores construam aplicativos mais rápido e com menos erros.

O Prisma fornece um método declarativo para definir os modelos de dados e as relações do seu aplicativo em um formato mais legível. Além disso, se você já tem um banco de dados, você não precisa passar pela dor de criar modelos de banco de dados do zero porque os recursos de introspecção do Prisma lidam com isso para você — é tão flexível.

O Prisma se integra suavemente com a arquitetura modular do NestJS, não importa se você está construindo APIs REST ou GraphQL. É normalmente usado dentro de seus serviços NestJS para atender às necessidades de dados dos controladores.

Em vez de aulas, o Prisma usa uma linguagem especial de definição de esquema. Basicamente, os desenvolvedores descrevem seus esquemas usando essa linguagem. O Prisma atropela os esquemas e escreve as migrações apropriadas dependendo do banco de dados escolhido. Também gera código de segurança de tipo para interagir com o banco de dados.

Em outras palavras, o Prisma oferece uma alternativa para escrever consultas SQL simples ou outros ORMs (como TypeORM ou Sequelize). Ele pode trabalhar com vários bancos de dados como PostgreSQL, MySQL e SQLite.

A combinação de NestJS e Prisma fornece um novo nível de segurança do tipo que é impossível de alcançar com qualquer outro ORM do ecossistema Node.js & TypeScript. Este exemplo demonstra como usar o Prisma Client

seguindo a arquitetura modular do NestJS através da Injeção de Dependência, implementando uma classe que fornecerá crud ou operações específicas de domínio para seus controladores de aplicativos.UserService

  • Mapeador relacional-objeto
  • Uma maneira de interagir com nosso banco de dados
  • Digite completamente o cofre

apresenta as seguintes ferramentas:

  • Cliente Prisma: Cliente de banco de dados gerado automaticamente e seguro para uso em seu aplicativo.
  • Prisma Migrar: Sistema de migração
  • Prisma Studio: GUI para visualizar e editar dados em seu banco de dados

Esquema prisma:

Todo projeto que usa uma ferramenta do kit de ferramentas Prisma começa com um arquivo de esquema Prisma. O esquema prisma permite que os desenvolvedores definam seus modelos de aplicativos em uma linguagem de modelagem de dados. Ele também contém a conexão a um banco de dados e define um gerador.

O esquema prisma tem poderosos recursos de modelagem de dados. Por exemplo, ele permite definir o campo de relação “nível Prisma”, o que facilitará o trabalho com as relações na API cliente Prisma.

Neste esquema, você configura três coisas:

  • Fonte de dados: Especifica sua conexão com o banco de dados (através de uma variável de ambiente)
  • Gerador: Indica que você deseja gerar o Cliente Prisma
  • Modelo de dados: Define seus modelos de aplicação

Pré-requisitos:

Este blog vai mostrar as seguintes coisas:

  • O arquivo de esquema prisma
  • Instalação do Prisma
  • Migrar nosso banco de dados usando Prisma migrar
  • Semeando um banco de dados inicial com um valor inicial
  • Valores de semeadura com cliente Prisma
  • Visualizando interface do usuário de dados usando o estúdio Prisma

E por causa disso, é importante que você tenha algum conhecimento básico sobre Node.js e npm.

Migrar nosso banco de dados usando Prisma migrar

Agora vamos migrar nosso banco de dados para criar tabelas vazias. O comando a seguir criará e aplicará migrações.

$ npx prisma migrate dev

Executar este comando pedirá que você nomeie a migração. Dar à migração um nome gerará o banco de dados SQLite.

Prisma ORM é bom?

Embora essa possa ser uma pergunta subjetiva, o Prisma visa facilitar que os desenvolvedores lidem com consultas de banco de dados.

Como qualquer desenvolvedor saberá, é absolutamente necessário que a maioria dos aplicativos interaja com bancos de dados para gerenciar dados. Essa interação pode ser na forma de consultas brutas ou frameworks ORM (como TypeORM). Embora consultas brutas ou construtores de consultas forneçam mais controle, eles reduzem a produtividade.

Por outro lado, as estruturas orm abstraem o SQL definindo o modelo de banco de dados como classes. Isso aumenta a produtividade, mas reduz drasticamente o controle do desenvolvedor. Também leva a incompatibilidade de objeto-impedância.

Padrões da lista Scalar

Para conectores de banco de dados que suportam listas escalares (PostgreSQL, CockroachDB e MongoDB), o Prisma 4 introduz a capacidade de definir um valor padrão em seu arquivo de esquema Prisma com o atributo:@default

Caminho de atualização

Esta é uma mudança de quebra se você já tinha padrões definidos para listas escalares no nível do banco de dados. Neste caso, você precisará:

  1. upgrade para os novos pacotes Prisma 4 seguindo estas instruções
  2. executar depois para recuperar qualquer configuração existente de índices e restrições. Isso precisa ser feito antes de executar qualquer ou comando, ou você perderá quaisquer padrões que estejam definidos no banco de dados, mas não anteriormente representados no esquema Prisma.npx prisma db pullnpx prisma db pushnpx prisma migrate dev

Restrições explícitas nas relações 1:1 @unique

Ao usar relações 1:1 no Prisma 4, você precisará adicionar explicitamente o atributo ao campo de escala de relação. Por exemplo, para esta relação 1:1 entre um modelo e um, você precisará adicionar o atributo ao campo:@unique UserProfile @uniqueprofileId

Caminho de atualização

Depois de atualizar para o Prisma 4, qualquer relação 1:1 sem um atributo sobre o scalar de relação desencadeará um erro de validação. Para atualizar, você precisará:@unique

  1. upgrade para os novos pacotes Prisma 4 seguindo estas instruções
  2. corrija manualmente os erros de validação do seu esquema Prisma adicionando o atributo explícito ou ao seu modelo de dados.@unique @id
  3. empurrar as alterações para o seu banco de dados usando para o MongoDB ou para o MySQL.prisma db pushprisma migrate dev

Uso forçado de ou atributo para relações 1:1 e 1:N (MySQL e MongoDB) @unique @id

Quando você usa relações 1:1 e 1:N no Prisma 4, você precisará usar um atributo no campo da relação para garantir que o lado singular(s) da relação tem apenas um registro. Isso agora é aplicado para MySQL e MongoDB, trazendo-os em linha com outros conectores. Os atributos ausentes agora desencadearão um erro de validação.@unique @unique

No exemplo a seguir de uma relação de um a muitos entre um e modelo, o atributo deve ser adicionado ao campo:UserPost @unique email

No exemplo a seguir de uma relação 1:1 entre a e modelo, o atributo deve ser adicionado ao campo:UserProfile @uniqueemail

Caminho de atualização

Depois de atualizar para o Prisma 4, qualquer relação um para um ou um para muitos sem um ou atributo no campo de relacionamento desencadeará um erro de validação. Para atualizar, você precisará:@unique @id

  1. upgrade para os novos pacotes Prisma 4 seguindo estas instruções
  2. corrija manualmente os erros de validação no seu esquema Prisma. Alternativamente, se você tiver um banco de dados ao vivo atualizado, a execução adicionará os atributos automaticamente.npx prisma db pull @unique

Proibir a sintaxe para relações implícitas de muitos para muitos references

Ao usar relações implícitas de muitas a muitas no Prisma 4, você não poderá mais usar o argumento, que antes era opcional. Por exemplo, a seguinte relação agora desencadearia um erro de validação:references

Em vez disso, você pode escrever:

Isso porque o único valor válido para era , então a remoção deste argumento torna mais claro o que pode ou não ser alterado.referencesid

Caminho de atualização

Depois de atualizar para prisma 4, qualquer relação implícita com um argumento desencadeará um erro de validação. Para atualizar, você precisará:references

  1. upgrade para os novos pacotes Prisma 4 seguindo estas instruções
  2. corrija manualmente os erros de validação no seu esquema Prisma. Alternativamente, se você tiver um banco de dados ao vivo atualizado, a execução removerá os argumentos automaticamente.npx prisma db pullreferences

Melhor gramática para literal de cordas

Os literais de string em seu Prisma Schema agora precisam seguir as mesmas regras que as strings em JSON. Isso muda principalmente a fuga de alguns personagens especiais. Mais detalhes podem ser encontrados na especificação JSON ou no site da JSON.

Caminho de atualização

Esta é uma mudança de ruptura para alguns esquemas existentes. Depois de atualizar para o Prisma 4, personagens escapus incorretos acionarão um erro de validação. Para atualizar, você precisará:

  1. upgrade para os novos pacotes Prisma 4 seguindo estas instruções
  2. corrija manualmente os erros de validação no seu esquema Prisma.

Mudanças no cliente

Esta seção inclui alterações que afetam o Cliente Prisma.

Mapeamento do tipo de consulta bruta: os valores escalares são agora deserializados como seus tipos JavaScript corretos

Nas versões 3.14.x e 3.15.x, o mapeamento do tipo de consulta bruta estava disponível com o recurso Visualização . Na versão 4.0.0, fizemos o mapeamento do tipo de consulta bruta geralmente disponível. Você não precisa usar para obter essa funcionalidade nas versões 4.0.0 e posteriores.improvedQueryRawimprovedQueryRaw

Consultas brutas agora desercionam valores escalares para seus tipos javaScript correspondentes. Note que o Prisma infere os tipos a partir dos próprios valores e não dos tipos Do Prisma Schema.

Consulta e resposta de exemplo:

const res =await prisma.$queryRaw`SELECT bigint, bytes, decimal, date FROM "Table";`console.log(res) // [{ bigint: BigInt("123"), bytes: Buffer.from([1, 2]), decimal: new Prisma.Decimal("12.34"), date: Date("<some_date>") }]

Caminho de atualização

A partir da versão 4.0.0, alguns tipos de dados retornam ou são diferentes, como segue:queryRawqueryRawUnsafe

Tipo de dadoAntes da versão 4.0.0Da versão 4.0.0DateTimeRetornou como StringRetornou como DateNumericRetornou como FloatRetornou como DecimalBytesRetornou como StringRetornou como BufferInt64Retornou como IntegerRetornou como BigInt

Se você usar ou devolver qualquer um dos tipos de dados acima, então você deve alterar seu código para lidar com os novos tipos.queryRawqueryRawUnsafe

Por exemplo, se você retornar os dados, então você precisa levar em conta o seguinte:DateTime

  • Você não precisa mais instanciar manualmente um objeto para os dados retornados.DateTime
  • Se o seu código usa atualmente os dados retornados, então agora você precisa converter o objeto em um .StringDateTimeString

Você deve fazer alterações de código equivalentes para os outros tipos de dados na tabela acima.

Mudanças gerais

Esta seção inclui alterações que afetam tanto o Esquema Prisma quanto o Cliente Prisma.

PrismaService

Uma classe pode ser implementada ampliando o gerado a fim de construir uma abstração do Cliente Prisma que se integra com sua arquitetura NestJS. Ele será fornecido a outros serviços e controladores via Injeção de Dependência.PrismaService PrismaClient

Node.js mudança mínima de versão

A partir da versão 4.0.0 do Prisma, a versão mínima do Node.js que suportamos é de 14.17.x. Se você usar uma versão anterior do Node.js, você precisará atualizá-lo.

Para que o Prisma é usado?

O Prisma melhora a segurança do tipo simplificando o acesso ao banco de dados, economizando e reduzindo a placa de caldeira CRUD repetitiva. O Prisma é fácil de integrar na sua estrutura preferida e é um kit de ferramentas de banco de dados ideal para criar APIs web confiáveis e escaláveis. O Prisma se integra rapidamente com várias estruturas, como GraphQL, Next.js, Nest, Apollo e Express.js

O Prisma aborda muitas deficiências dos ORMs tradicionais, como falta de segurança do tipo, lógica mista de negócios e armazenamento e consultas imprevisíveis causadas pelo carregamento preguiçoso.

Configuração inicial do projeto

Para começar com este tutorial, certifique-se de que você tem:

  • node.js (≥v10.13.0, exceto v13) instalado
  • Carteiro instalado

Antes de começarmos a construir um aplicativo Nest, você precisa instalar o Nest CLI com o comando abaixo:

npm i -g @nestjs/cli

Aguarde o término da instalação. Uma vez concluída a instalação, crie um novo aplicativo Nest com o comando abaixo:

nest new prisma-api

Escolha npm como o gerenciador de pacotes preferido e aperte Enter. O aplicativo passará por alguns processos de instalação.

Uma vez que o NPM tenha instalado todos os pacotes necessários para executar o aplicativo, altere o diretório para a pasta do projeto e execute o servidor com o comando abaixo:

npm run start:dev

Começando com prisma

Este tutorial usa prisma v3.11.0. Instale o Prisma CLI como uma dependência de desenvolvimento com o comando abaixo:

npm install prisma -save-dev

Uma vez concluída a instalação, invoque o Prisma CLI localmente usando npx com o comando abaixo:

npx prisma

Agora, crie sua configuração inicial do Prisma usando o comando Prisma init:

npx prisma init

O comando acima cria um novo diretório Prisma com os seguintes arquivos:

  • schema.prisma: especifica sua conexão com o banco de dados e contém o esquema do banco de dados
  • .env: um arquivo dotenv normalmente usado para armazenar suas credenciais de banco de dados em um grupo de variáveis de ambiente

Conectando-se a um banco de dados

Com o Prisma instalado, a configuração no seu computador é bem fácil. Para a demonstração neste tutorial, vamos nos conectar a um banco de dados postgreSQL. Para começar, abra o arquivo datasource/schema.prisma e atualize o conteúdo com o código abaixo:

No trecho acima, especificamos o PostgreSQL como nosso provedor de banco de dados. Agora, modifique o arquivo .env para especificar a localização do arquivo do banco de dados.

DATABASE_URL=”postgresql://username:password@host:port/database_name?schema=public”

Criando o esquema do banco de dados

Com a conexão do banco de dados configurada, agora você pode criar suas tabelas de banco de dados definindo um esquema no arquivo schema.prisma. Para a demonstração neste tutorial, vamos definir um esquema Todo, com o código abaixo:

Gere seus arquivos de migração postgreSQL e execute-os contra o banco de dados com o comando abaixo:

npx prisma migrate dev -name init

Configuração do Prisma Client e do Prisma Service

O Prisma Client é um cliente de banco de dados com segurança de tipo gerado a partir da definição do modelo Prisma. Ele expõe as operações CRUD adaptadas especificamente aos seus modelos.

Instale o Prisma Client com o comando abaixo:

npm install @prisma/client

Com o Prisma Client configurado, crie um arquivo prisma.service na pasta src para preencher a API do Cliente Prisma para consultas de banco de dados dentro de um serviço com o código abaixo:

No código acima, criamos um novo PrismaService que cuida de instanciar PrismaClient e se conectar ao seu banco de dados.

Use o Cliente Prisma em seus serviços NestJS

Agora você pode enviar consultas de banco de dados com o Prisma Client. Se você quiser saber mais sobre como construir consultas com o Prisma Client, confira a documentação da API.

Ao configurar seu aplicativo NestJS, você deseja retirar a API do Cliente Prisma para consultas de banco de dados dentro de um serviço. Para começar, você pode criar um novo que cuide da instanciação e conexão ao seu banco de dados.PrismaServicePrismaClient

Dentro do diretório, crie um novo arquivo chamado e adicione o seguinte código a ele:srcprisma.service.ts

se você deixá-lo de fora, o Prisma se conectará preguiçosamente em sua primeira chamada ao banco de dados. Não nos incomodamos, já que o Prisma tem seus próprios ganchos de desligamento onde destruirá a conexão.

Em seguida, você pode escrever serviços que você pode usar para fazer chamadas de banco de dados para o e modelos a partir de seu esquema Prisma.UserPost

Ainda dentro do diretório, crie um novo arquivo chamado e adicione o seguinte código a ele:srcuser.service.ts

Observe como você está usando os tipos gerados pelo Prisma Client para garantir que os métodos expostos pelo seu serviço sejam devidamente digitados. Portanto, você salva a caldeira de digitar seus modelos e criar interface adicional ou arquivos DTO.

Gerando um módulo todo

Com o serviço Prisma configurado, gere um módulo para toda a lógica com o comando abaixo:

nest generate module todo

Em seguida, gere um arquivo de serviço para o módulo de usuário com o comando abaixo:

nest generate service todo

Em seguida, atualize o conteúdo do arquivo todo.service com o código abaixo:

No código acima, criamos todas as operações CRUD para o serviço do nosso usuário.

Agora, gere um controlador para definir todas as rotas de API para o serviço do usuário com o comando abaixo:

nest generate controller todo

Atualize o conteúdo do arquivo todo.controller.ts com o código abaixo:

Abra o arquivo todo.module.ts, importe o PrismaService e adicione-o ao array de provedores com o código abaixo:

Neste ponto, você criou com sucesso sua API Nest Prisma REST! Agora vamos testar o aplicativo usando carteiro.

Testando nossa aplicação

Com todas as rotas de API para o aplicativo de demonstração criado, inicie Carteiro e teste os pontos finais.

Adicionar toda rota:

Obtenha toda rota:

Mudanças de esquema

Esta seção inclui alterações que afetam o Esquema Prisma.

Configuração do índice

No Prisma 4, o recurso Preview agora estará disponível. Isso inclui as seguintes opções de configuração de índice:extendedIndexes

  • Configuração de comprimento de índices, restrições únicas e restrições de chave primária para MySQL (em Visualização nas versões 3.5.0 e posterior)
  • Configuração de ordem de ordem de índices, restrições únicas e restrições de chave primária (em Visualização nas versões 3.5.0 e posterior)
  • Novos tipos de índice para PostgreSQL: Hash (em Visualização nas versões 3.6.0 e posterior) e GIN, GiST, SP-GiST e BRIN (em Visualização nas versões 3.14.0 e posterior)
  • Clustering de índice para SQL Server (em Visualização nas versões 3.13.0 e posterior)

REST API

O objetivo desta lição é usar PrismaService para implementar operações REST CRUD para o modelo Product e definir tipos para a API Swagger.

Você continua a trabalhar com o mesmo projeto que configurou na lição 1. O início desta lição é a ramificação `rest-api` deste repositório. Antes de mudar para essa ramificação, você precisa confirmar o estado atual do seu projeto. Para simplificar, você pode usar o comando `stash` para fazer isso:

git add .
git stash
git checkout rest-api

Operações CRUD

Depois de verificar o branch rest-api, você está pronto para começar a implementar a API REST.

Gerar recurso REST

Você implementará endpoints REST para todas as operações CRUD para o modelo Product. Você vai precisar gerar um controlador, um serviço, um módulo, classe de entidade… espere aí tem uma solução mais fácil. Nest CLI tem um comando para gerar todo o código clichê para um novo recurso. Crie um novo recurso para produtos executando o seguinte comando e responda aos prompts da CLI:

nest g resource# CLI prompts
? Que nome você gostaria de usar para este recurso (plural, por exemplo, "usuários"
? produtos
? Qual camada de transporte você usa? API REST
? Você gostaria de gerar pontos de entrada CRUD? (S/n) s

Resumo

Nesta receita, você aprendeu a usar o Prisma junto com o NestJS para implementar uma API REST. O controlador que implementa as rotas da API está chamando um que, por sua vez, usa o Cliente Prisma para enviar consultas a um banco de dados para atender às necessidades de dados das solicitações recebidas.PrismaService

Por que Prisma e NestJS?

Abraçando TypeScript

O Prisma é o primeiro ORM que fornece total tipo de segurança, mesmo consultando modelos parciais e relações.

Integração suave

O Prisma se encaixa perfeitamente na arquitetura modular do NestJS e fornece uma poderosa camada de acesso ao banco de dados.

Cliente de banco de dados com segurança de tipo

O Prisma Client garante consultas de banco de dados totalmente seguras com benefícios como autocompleção — mesmo no JavaScript.

Modelagem intuitiva de dados

A linguagem de modelagem declarativa do Prisma é simples e permite que você descreva intuitivamente seu esquema de banco de dados.

Migrações fáceis de banco de dados

Gerar migrações SQL previsíveis e personalizáveis a partir do esquema informativo prisma.

Projetado para construir APIs

O Cliente Prisma reduz as caldeiras fornecendo consultas para recursos comuns de API (por exemplo, paginação, filtros, …).

Conclusão

Com isso, completamos nossa meta de construir a API NestJS Prisma REST. Começamos a partir do básico do Prisma e trabalhamos nossa maneira de escrever o esquema, gerando uma migração e cliente para interagir com nossas tabelas de banco de dados.

✅ Espero que este pequeno post o ajude com muitos cenários comuns durante o desenvolvimento de aplicações com o NestJS usando o Prisma.

Espero que este artigo tenha sido útil.

Se você tiver algum feedback ou encontrar erros, por favor, não hesite em me contatar.

Todas as suas sugestões ou comentários são bem-vindos. Você também pode se conectar comigo no github e linkedin

Obrigado!

((((((((((((((((((((( Sempre irei postar conteúdos sobre node e nestjs)))))))))))))))))))

Se este post foi útil, clique no botão bater palmas 👏 abaixo algumas vezes para mostrar seu apoio! ⬇⬇

--

--