Segurança de tipo com Prisma e MongoDB
Avalie esse Tutorial
Você sabia que o Prisma agora oferece suporte ao MongoDB? Neste artigo, veremos como usar o Prisma para se conectar ao MongoDB.
Prisma é um mapeador relacional de objetos (ORM) de código aberto para Node.js compatível com JavaScript e TypeScript. Ele realmente brilha ao usar o TypeScript, ajudando você a escrever um código que seja legível e seguro de digitar.
Se você quiser ouvir Nikolas Burk e Matthew Meuller do Prisma, confira este episódio do MongoDB Podcast.
Os esquemas ajudam os desenvolvedores a evitar problemas de inconsistência de dados ao longo do tempo. Embora você possa definir um esquema no nível do banco de dados no MongoDB, o Prisma permite definir um esquema no nível do aplicativo. Ao usar o Prisma Client, um desenvolvedor recebe o auxílio do preenchimento automático de queries, já que o Prisma Client está ciente do esquema.
Geralmente, os dados doque são acessados juntos devem ser armazenados juntos em um banco de dados MongoDB. O Prisma oferece suporte ao uso de documentos incorporados para manter os dados juntos.
No entanto, pode haver casos de uso em que você precisará armazenar dados relacionados em coleções separadas. Para fazer isso no MongoDB, você pode incluir o campo
_id
de um documento em outro documento. Nesse caso, o Prisma pode ajudá-lo a organizar esses dados relacionados e manter a integridade referencial dos dados.Vamos pegar um projeto de exemplo existente do repositório
prisma-examples
do Prisma.Um dos exemplos é uma plataforma de gerenciamento de conteúdo de blog. Este exemplo usa um banco de dados SQLite. Vamos convertê-lo para usar o MongoDB e, em seguida, inserir alguns dados fictícios.
Neste artigo, usaremos um MongoDB Atlas cluster. Para criar uma conta gratuita e seu primeiro cluster gratuito para sempre, siga o guia Comece a usar o Atlas.
Primeiro, precisamos configurar nossa variável de ambiente para nos conectarmos ao banco de dados do MongoDB Atlas. Adicionarei minha string de conexão do MongoDB Atlas a um arquivo
.env
.Exemplo:
1 DATABASE_URL="mongodb+srv://<username>:<password>@<cluster>.mongodb.net/prisma?retryWrites=true&w=majority"
Você pode obter sua string de conexão no dashboard do Atlas.
Agora vamos editar o arquivo
schema.prisma
.Se você estiver usando o Visual Studio Code, certifique-se de instalar a extensão oficial Prisma VS Code para ajudar com a formatação e o preenchimento automático.
Enquanto estiver no VS Code, instale também a extensão do MongoDB VS Code oficial para monitorar seu banco de dados diretamente no VS Code!
No objeto
datasource db
, definiremos o provedor como "mongodb" e o URL para nossa variável de ambiente DATABASE_URL
.Para o modelo
User
, precisaremos atualizar o id
. Em vez de Int
, usaremos String
. Definiremos o padrão como auto()
. Como o MongoDB nomeia o campo id
_id
, mapeamos o campo id
para _id
. Por último, diremos ao Prisma para usar o tipo de dados ObjectId
para o campo id
.Faremos o mesmo com o modelo
Post
campo id
. Também alteraremos o campo authorId
para String
e definiremos o tipo de dados como ObjectId
.1 generator client { 2 provider = "prisma-client-js" 3 } 4 5 datasource db { 6 provider = "mongodb" 7 url = env("DATABASE_URL") 8 } 9 10 model User { 11 id String @id @default(auto()) @map("_id") @db.ObjectId 12 email String @unique 13 name String? 14 posts Post[] 15 } 16 17 model Post { 18 id String @id @default(auto()) @map("_id") @db.ObjectId 19 createdAt DateTime @default(now()) 20 updatedAt DateTime @updatedAt 21 title String 22 content String? 23 published Boolean @default(false) 24 viewCount Int @default(0) 25 author User @relation(fields: [authorId], references: [id]) 26 authorId String @db.ObjectId 27 }
Esse esquema resultará em uma coleção separada
User
e Post
no MongoDB. Cada publicação terá uma referência a um usuário.Agora que temos nosso esquema configurado, vamos instalar nossas dependências e gerar nosso esquema.
1 npm install 2 npx prisma generate
Se você fizer alguma alteração posterior no esquema, precisará executar
npx prisma generate
novamente.Em seguida, precisamos alimentar nosso banco de dados. O repositório vem com um arquivo
prisma/seed.ts
com alguns dados fictícios.Então, vamos executar o seguinte comando para alimentar nosso banco de dados:
1 npx prisma db seed
Isso também cria as coleções
User
e Post
definidas em prisma/schema.prisma
.Como fizemos algumas alterações no tipo de dados
id
, precisaremos atualizar parte do código de exemplo para refletir essas alterações.Aqui está um exemplo. Precisamos remover a chamada
Number()
da referência ao campo id
, pois agora ele é uma String
.1 // BEFORE 2 async function handleGET(postId, res) { 3 const post = await prisma.post.findUnique({ 4 where: { id: Number(postId) }, 5 include: { author: true }, 6 }) 7 res.json(post) 8 } 9 10 // AFTER 11 async function handleGET(postId, res) { 12 const post = await prisma.post.findUnique({ 13 where: { id: postId }, 14 include: { author: true }, 15 }) 16 res.json(post) 17 }
Observe neste arquivo, ao passar o mouse sobre a variável
post
, o VS Code sabe que é do tipo Post
. Se quisermos um campo específico disso, o VS Code sabe automaticamente quais campos estão incluídos. Sem suposições!Essas são todas as atualizações necessárias. Agora podemos executar o aplicativo e os dados são exibidos.
1 npm run dev
Podemos abrir o aplicativo no navegador em
http://localhost:3000/
.Na página principal, você pode clicar em uma publicação para vê-la. A partir daí, você pode excluir a publicação.
Podemos acessar a página de Rascunhos para ver qualquer postagem não publicada. Quando clicamos em qualquer postagem não publicada, podemos publicá-la ou excluí-la.
O botão "Signup" nos permitirá adicionar um novo usuário ao banco de dados.
E, por fim, podemos criar uma nova publicação clicando no botão "Criar rascunho".
Todas essas ação são realizadas pelo cliente Prisma usando as rotas da API definidas em nosso aplicativo.
O Prisma facilita o manuseio de esquemas no MongoDB. Ele se destaca especialmente ao usar o TypeScript, tornando seu código legível e seguro em relação aos tipos. Ele também ajuda a gerenciar vários relacionamentos de coleções por meio da integridade referencial.
Posso ver o benefício de definir seu esquema no nível do aplicativo e usarei o Prisma para me conectar ao MongoDB no futuro.