DEV Community

Cover image for Criando sua API com Fastify e Prisma
Vinicius Rodrigues
Vinicius Rodrigues

Posted on

Criando sua API com Fastify e Prisma

Vinicius Rodrigues - Fullstack Developer - LinkedIn

Se você está lendo isso eu imagino que queira ter um primeiro contato com o Fastify ou esteja com alguma dúvida para iniciar o desenvolvimento da sua aplicação, sendo assim vamos direto ao ponto:

Fastify

O Fastify é um framework assim como o express que nos fornece um servidor http, é a base do nosso projeto e o que vai nos permitir criar nossa API de forma extremamente simples. Dentre as funcionalidades do Fastify creio que devemos abordar os Hooks, Decorators e Plugins

Hooks

Se você já construiu uma API já deve ter utilizado um middleware e esses "hooks" como o Fastify chama são nada mais do que middlewares. Você deve estar pensando na inutilidade disso agora mas não é bem assim, com os hooks podemos atribuir globalmente as nossas rotas todo tipo de tratamento ao qual nos for necessário. Mais a frente vamos ver um exemplo prático, por enquanto deixo este aqui:

fastify.addHook('preHandler', (request, reply, done) => {
  console.log('Antes de lidar com a requisição');
  done();
});
Enter fullscreen mode Exit fullscreen mode

Decorators

Decorators em geral são funções usadas para adicionar funcionalidades em outro código, os decorators do Fastify não fogem desse conceito pois basicamente são uma extensão da instância do Fastify.

// Criação do decorator 'uppercase'
fastify.decorate('uppercase', function (value) {
  return value.toUpperCase();
});

fastify.get('/uppercase/:text', (request, reply) => {
// Usando o decorator 'uppercase' para converter 
// o parâmetro da rota para maiúsculas
  const uppercaseText = request.uppercase(request.params.text);
  reply.send({ uppercaseText });
});
Enter fullscreen mode Exit fullscreen mode

Sendo assim, onde você tiver acesso a instância do fastify também será possível acessar todos os decorators.

Plugins

Aqui nos deparamos com um dos principais conceitos do fastify, pense no plugin como uma peça de lego que sozinha pode não fazer muito sentido, cada peça tem seu formato, cor, encaixe... e os plugins podem ter diferentes funcionalidades, vou deixar uns exemplos:

  • Handler de erros
  • Rotas http
  • Plugin de internacionalização
  • Conexão com bancos de dados

Mão na massa

Instale o Fastify, fastify-plugin e Prisma

pnpm add fastify fastify-plugin prisma
Enter fullscreen mode Exit fullscreen mode

Crie o arquivo app.ts, aqui vamos inicializar nosso servidor.

// src/app.ts
import fastify from 'fastify'
import { dbPlugin } from './plugins/db-plugin'

// Registrar plugin do prisma
fastify.register(dbPlugin)

// Rota simples
fastify.get('/', (request, reply) => {
  reply.send({ hello: 'world' });
});

fastify.listen(3000, (err) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
  console.log('Servidor rodando em http://localhost:3000');
});
Enter fullscreen mode Exit fullscreen mode

Feito isso, precisamos criar nosso plugin db-plugin onde estará o prisma client.

// src/plugins/db-plugin.ts

import fp from 'fastify-plugin';
import { PrismaClient } from '@prisma/client';

async function prismaPlugin(fastify, options) {
  const db = new PrismaClient();

  // Adiciona o objeto Prisma Client ao fastify, para que 
  // possa ser acessado em rotas e outros plugins
  fastify.decorate('db', db);

  // Se você quiser pode adicionar um **hook** para ter 
  // acesso ao **db** dentro do objeto de request.
  fastify.addHook('onRequest', (req, reply, done) => {
    req.db = db
    done();
  });

  // Fecha a conexão do Prisma Client quando o aplicativo 
  // Fastify é fechado
  fastify.addHook('onClose', async (fastifyInstance) => {
    fastifyInstance.db.$disconnect();
  });
}

export default fp(prismaPlugin);
Enter fullscreen mode Exit fullscreen mode

O que eu fiz com o prisma pode ser feito com qualquer outra conexão com o banco, seja outro ORM, QueryBuilder ou o driver nativo. O mesmo vai ser aplicado pra diversas outras coisas, como um tratamento de logs, uma classe de erros global ou uma conexão com outro serviço.

Espero ter ajudado com esse pequeno artigo, tenho um projeto onde apliquei esses conceitos então vou deixa-lo aqui

Top comments (2)

Collapse
 
viniciusnascimento95 profile image
Vinicius Fernandes

muito bom, curti bastante, acredito que essa ferramenta é bem objetiva e simples de usar

Collapse
 
cassianobraz profile image
Cassiano Pereira Braz

Que tema bacana! Tenho uma sugestão para torná-lo ainda mais inovador: você poderia criar uma integração usando Fastify com Vercel e TypeScript. Acredito que essa combinação pode ser um desafio interessante, pois ainda não vi ninguém implementando isso na internet. Seria uma ótima oportunidade para explorar essas tecnologias juntas!