Vamos falar sobre Pipes no NestJS
Vamos entrar a fundo num tema que achei super interessante quando comecei a trabalhar com NestJS
Prêmiação Globant!
Antes eu gostaria de começar pedindo ajuda de você que assina minha newsletter para votar em mim no prêmio Women That Build Edition da Globant 🥹
Para aqueles que não conhecem, este prêmio tem como objetivo reconhecer mulheres que são protagonistas em suas carreiras e visam mudar a realidade de uma indústria de tecnologia dominada por homens. Além disso, pretende inspirar mulheres e pessoas não-binárias a se interessarem por carreiras relacionadas à STEAM e criar uma indústria mais diversa e inclusiva.
→ https://womenawards.globant.com/2023/RisingStar/AnaBeatrizNeri
. . .
Bora pro conteúdo!
Eu comecei e estudar a fundo NestJS no começo desse ano quando me deparei com o mesmo no meu trabalho, eu vim com uma carga de 4 anos utilizando Java e SpringBoot então minha base com annotations e injeção de dependências era bem forte.
E essa foi uma das razões de eu ter curtido bastante Pipes no NestJS, vou explicar abaixo pra você como utilizar cada pipe, sua responsabilidade, funções e conclusão!
Já não se se esquece de se inscrever na minha newsletter!
No NestJs Pipe é uma classe que esta anotada com o decorator @Injectable na qual implementa a interface PipeTransformation
Pipes no geral servem para 2 coisas dentro do código:
Transformar o input do dado no formato desejado
Validação dos dados de entrada, caso seja avaliado como válido o dado de entrada passar senão irá lançar uma exceção
No nível do controller o pipe validation é muito usado, pois antes do método ou handler ser chamado o mesmo passa por um pipe como um argumento e faz o processo de validação ou tranformação.
Depois do pipe finalizado é chamado o handler, Nest vem com pipes embutidos e implementados por debaixo dos panos mas também é possível desenvolver personalizado de acordo como que você queira;
Neste post eu vou te mostrar como vincular pipes integrados ao handler e criar um pipe personalizado e vincular o mesmo a um handler.
BUILT-IN PIPES
Pipes que o NestJS fornece por default
ValidationPipe
ParseUUIDPipe
ParseIntPipe
ParseFloatPipe
ParseEnumPipe
ParseBoolPipe
ParseArrayPipe
DefaultValuePipe
BINDING PIPES
Pipes que o NestJS fornece por default
ParseUUIDPipe garante que o handler passe UUID certo como parâmetro.
Um exemplo prático seria pra busca de um User pelo seu id, vamos considerar esse id como UUID.
Nesse caso é importante garantir que o que for ser buscado pela camada do controller seja um UUID válido, nesse caso da pra usar o ParseUUIDPipe para validar o mesmo.
Este pipe é chamado antes de executar o handler
Usando o exemplo acima se o UUID vier errado um erro com status code 400 irá estourar com a mensagem de um UUID válido esperado
CUSTOM PIPES
Todo pipe deve implementar o método transform() para cumprir o contrato na interface PipeTransform, esse método conta com
Valor: argumetno que se passa ao Pipe
Metadata: meta detalhes dos argumentos
GLOBAL PIPES
Quando utilizei nestjs essa foi a funcionalidade que mais curti, pois com Global Scoped Pipes é possível anexar qualquer pipe à nível global. Em seguida esse pipe será aplicado a qualquer rota em qualquer controller em todo o projeto.
Se o pipe precisar ser especificado em um único módulo sem ser global, é possível vincular o pipe dentro do módulo que queira
Conclusão de toda essa informação 🥵
Basicamente, um Pipe é uma funcionalidade do NestJS que permite validar e transformar dados de entrada antes que eles sejam processados por um manipulador de requisição. Eles funcionam como filtros ou canos, nos quais os dados passam para serem modificados ou validados antes de serem processados.
Os Pipes de Validação são usados para garantir que os dados de entrada estejam corretos e cumpram as regras definidas.
Podem verificar se um campo é obrigatório, se está dentro de um determinado formato ou se atende a qualquer outra condição específica. Se os dados não passarem pela validação, o NestJS retornará um erro antes de prosseguir com o processamento.
Já os Pipes de Transformação permitem alterar a estrutura ou o formato dos dados de entrada.
São úteis quando você deseja converter automaticamente um tipo de dado para outro, como transformar uma string em um número ou aplicar uma formatação específica a uma data. Esses pipes podem simplificar muito a lógica do seu código, evitando que você precise fazer conversões manualmente em vários lugares.
Agora, por que é interessante usar Pipes no NestJS? Listei algumas que acho bem bacanas:
Reutilização de código: Os Pipes podem ser reutilizados em vários endpoints da sua aplicação. Eles encapsulam a lógica de validação e transformação, permitindo que você os aplique a diferentes rotas e controladores, mantendo seu código mais limpo e modular.
Separação de contextos: Os Pipes ajudam a separar a validação e a transformação dos dados do restante da lógica do seu aplicativo.
Isso promove a modularidade e facilita a manutenção, pois cada parte do código pode se concentrar em uma tarefa específica.
Melhoria da robustez e segurança: Ao usar Pipes de Validação, você pode garantir que os dados de entrada estejam em conformidade com as regras definidas. Isso ajuda a evitar erros e falhas decorrentes de dados inválidos ou maliciosos.
Código mais limpo e legível: Os Pipes permitem remover a lógica de validação e transformação dos controladores e serviços, tornando o código mais enxuto, legível e focado nas principais funcionalidades.
. . .
Em resumo, os Pipes no NestJS são poderosos mecanismos que fornecem validação e transformação de dados de entrada de forma modular e reutilizável. Eles ajudam a garantir que seus dados sejam válidos e consistentes, melhorando a robustez, segurança e legibilidade do seu código.
Portanto, incorporar Pipes em sua aplicação NestJS é uma prática recomendada para criar APIs mais robustas e fáceis de manter.
Separei aqui alguns links de estudo e busca sobre este tema pra você:
Documentação oficial do NestJS sobre Pipes:
Exemplos práticos de uso de Pipes no NestJS:
Tutorial do NestJS com exemplos de uso de Pipes:
Artigo do Medium explicando o uso de Pipes no NestJS: