O que é um Interceptor?
Um interceptor é uma classe anotada com o decorator @Injectable() (uma das features do Nest), e devem conter um implement da interface Nest Interceptor.
Os Interceptors tem um conjunto de capacidades inspiradas na técnica de AspectOriented Programming (AOP), em português: Programação orientada a aspecto. Isso torna possível:
- Vincular lógica de programação extra antes/ depois da execução do método
- Transformar o resultado retornado de uma função
- Transformar o erro de exception retornado de uma função
- Estender o comportamento básico de uma função
- Substituir completamente uma função dependendo de condições específicas (por exemplo, para fins de armazenamento em cache)
Se você vem do mundo do Express, já deve estar familiarizado com a ideia de um middleware. Um middleware é basicamente uma função que recebe um request e retorna uma response baseada no request.
No entanto, o problema do middleware é que ele é chamado apenas antes de o manipulador de rota ser chamado. Você tem acesso ao objeto de resposta, mas não tem o resultado do manipulador de rota.
Não há uma maneira simples de ter uma função que pode configurar alguns dados antes que a solicitação seja tratada, ao mesmo tempo que também pode executar alguma lógica após a solicitação.
Um Interceptor, no entanto, consegue fazer isso. Ao usar RxJs Observables, os Interceptors permitem que você programe a lógica em qualquer ponto do ciclo de vida da solicitação.
O primeiro use-case que vamos observar utiliza um interceptor para registrar a interação do usuário(por exemplo, armazenar chamadas do usuário, despachar eventos de forma assíncrona ou calcular um carimbo de data / hora). Observe no “Interceptor.ts” abaixo:
Interceptors, assim como controllers, providers, guards, e assim por diante, podem injetar dependências por meio de seu construtor.
Fazendo isso, toda vez que alguém acessar um endpoint de sua aplicação, ele registrará o tempo que levou para fazer a solicitação. Isso também pode escalar para contextos maiores e mais complexos.
Interceptor Global
Você pode configurar o interceptor para ser executado em um controller ou em uma parte específica de sua API, ou pode apenas configurá-lo globalmente e ele funcionará em toda a sua API.
Os Global Interceptors são usados em toda a aplicação, para cada controller e cada manipulador de rota. Em termos de injeção de dependência, interceptores globais registrados de fora de qualquer módulo não podem injetar dependências, pois isso é feito fora do contexto de qualquer módulo.
Para resolver esse problema,você pode configurar um interceptor diretamente de qualquer módulo usando a seguinte construção:
Ao usar essa abordagem para realizar injeção de dependência para o interceptor, observe que, independentemente do módulo onde esta construção é empregada, o interceptor é, de fato, global.
Também podemos separar o tipo de ação que o Interceptor realizará com base no tipo de solicitação, se é uma solicitação HTTP ou mesmo uma solicitação GraphQL. Dê uma olhada nos exemplos abaixo:
Olhando para o ExecutionContext, podemos descobrir se é uma solicitação HTTP ou GraphQL e tratá-la de forma diferente. Nesse caso, queremos informações diferentes dependendo do tipo de solicitação.
Quando se trata de uma solicitação Http, queremos retornar um objeto “http Info” com um timestamp de quando esse usuário acessou o endpoint, seu nome de usuário, o caminho desse endpoint e o método de solicitação (GET, POST, PATCH…). Mas quando a requisição é do tipo GraphQL, ela muda um pouco e traz um novo campo, os params daquela requisição, retornando em um objeto chamado “graphqlInfo”.
Outros decorators
Vamos dar uma olhada em outro uso comum para o interceptor. Imagine que você gostaria de lidar com os timeouts em solicitações de rota. Quando seu endpoint não retorna nada após um período de tempo, você deseja encerrar com uma resposta de erro.
Após 5 segundos,o processamento da solicitação será cancelado. Você também pode adicionar lógica personalizada antes de lançar o RequestTimeoutException.
Conclusão
Pudemos observar as diferentes aplicações do Interceptor, e agora é com você DEV! Não esqueça de checar a documentação se surgir interesse nesta ferramenta tão completa que é o Nest.