Vigilando código de forma inteligente com Interceptors
O que é e como usar a interface do NestJS a NestInterceptor
Como o problema começou 🧐
Tudo começou com uma tarefa na qual era necessário trazer histórico de mudanças dentro de uma aplicação, a responsabilidade seria de criar um código no backend que captasse essas mudanças.
Foi aí a descoberta interessante de uma interface que o NestJS proporciona, chamada de interceptor.
Utilizei dessa interface para implementar uma lógica que intercepita uma request de update que analisa, compara e valida todas as mudanças realizadas criando em uma nova tabela de histórico que sera consumida por um endpoint get.
De uma forma BEM simplificada, seria como o diagrama abaixo:
O que achei mais interessante foi a possibilidade de transformar dessa classe extendida do NestInterceptor um decorator que fica vigilando todo meu endpoint de update capturando suas mudanças, foi uma forma muito prática de realizar e (tirando toda lógica de busca) relativamente simples de implementar.
O que é um Interceptor na sua essência
Um interceptor em NestJS é uma classe especial que implementa a interface NestInterceptor
. Ele permite que você intercepte o ciclo de execução de uma solicitação HTTP, executando lógica personalizada antes e/ou depois que a rota solicitada seja processada pelo controlador.
Interceptores são poderosos porque eles fornecem uma forma centralizada de aplicar lógica comum a várias rotas, sem a necessidade de duplicar código em múltiplos lugares. Eles podem ser usados para diversas finalidades, incluindo:
Modificação de requisições e respostas: Você pode modificar a solicitação antes de ela chegar ao controlador ou alterar a resposta antes de ser enviada ao cliente.
Logging: Interceptores são ideais para implementar logging, capturando informações sobre as requisições e respostas.
Tratamento de erros: Eles podem capturar e manipular erros que ocorrem durante a execução de uma rota.
Manipulação de tempo de execução: Interceptores podem ser usados para medir o tempo de execução de uma requisição.
Como funciona no NestJS
Há quem ame que há quem odeio NestJS, mas inegávelmente ele proporciona intrefaces bem interessantes para agilizar o desenvolvimento.
Como no meu caso o projeto já era todo estruturado no NestJS, com typescript eu tive de ir pra esse caminho.
Porém existe a possibilidade de usar o conceito de interceptors para codificar com javascript puro, vide o link com um artigo super interessante:
Leia o artigo da Mozilla aqui!
No NestJS, um interceptor é uma classe que implementa o método intercept
, que recebe dois parâmetros principais:
ExecutionContext
: Fornece detalhes sobre o contexto de execução, como a rota chamada, os parâmetros de requisição, os headers, entre outros.CallHandler
: Um manipulador que representa o próximo ponto na cadeia de execução, ou seja, o próximo passo a ser executado na pilha de middleware, controladores, etc.O método
intercept
retorna umObservable
, o que significa que ele pode ser usado para manipular fluxos assíncronos de dados.👩💻 Como Criar um Interceptor no NestJS
Para criar um interceptor, você precisa:
Criar uma classe que implemente a interface
NestInterceptor
.Implementar o método
intercept
.Decorar a classe com o decorador
@Injectable()
para torná-la um provedor no contexto do NestJS.
No exemplo abaixo vou te mostrar um exemplo de implementação básico de um interceptor:
Eu posso trazer um exemplo de implementação similar ao que trouxe no início da news referente ao que foi o estopim para descoberta do interceptor em si com algoritmo de busca Flatten, caso seja de interesse comenta aí!
Primeiro vamos ao simples de como implementar o interceptor com a interface que o NestJS proporciona:
(sorry o bug, o carbon bugou no momento de colar o código 😬)
E abaixo como vigilar o código que você quer:
O interceptor
LoggingInterceptor
será aplicado ao métodogetData
.Quando a rota
GET /example
for chamada, o interceptor será invocado, permitindo que a lógica de registro seja aplicada.
Fazendo nossa vida de Dev simples!
Interceptores em NestJS são uma ferramenta poderosa para lidar com diversas operações que necessitam de lógica comum ou transversal, como logging, validações, manipulação de respostas, e muito mais.
Eles permitem uma abordagem modular e centralizada, simplificando o código do aplicativo e facilitando a manutenção.
Claro, como disse é possível de utilizar sem o NestJs em si, para não obter todo ecossistema que ele traz, você pode implementar o interceptor por si:
Com a implementação correta, interceptors no geral podem melhorar significativamente a qualidade e a robustez de sua aplicação, fornecendo controle e flexibilidade sobre o fluxo de requisições e respostas.
E aí você sabia dessa? Conta aqui nos comentários:
Dicas da semana 🔥
[INGLÊS] - Galera vocês me vêem falando muito da Fluencypass aqui, com meu intercâmbio chegando estou usando 100% da plataforma e fiquei muito feliz em estreiar o curso de inglês para tech que lançou recentemente, caso queiram conferir → INGLÊS TECH
[EVENTO GRÁTIS] - Super evento da NodeBR vai rolar dia 30 de Agosto na Reactor e estamos com submissão de palestras em aberto!!! O tema do evento será sobre como construir APIs like a Boss, espero sua palestra por lá → MANDA TALKS
E claro, se inscrevam nesse evento incríveeeeeel → Events | Microsoft Reactor