Diferença entre interceptor e middleware NestJS
A diferença entre interceptor e middleware NestJS é um aspecto crucial para desenvolvedores que buscam entender como manipular requisições e respostas em aplicações construídas com este framework. Ambos são utilizados para interceptar e modificar o fluxo de dados, mas possuem finalidades e implementações distintas. Os interceptors são utilizados para adicionar lógica antes ou depois da execução de um manipulador de rota, enquanto os middlewares atuam no nível da requisição, permitindo que você modifique a requisição ou a resposta antes que ela chegue ao manipulador.
Interceptors no NestJS
Os interceptors no NestJS são classes que implementam a interface NestInterceptor. Eles podem ser usados para transformar o resultado de uma chamada de método, adicionar lógica de controle, ou até mesmo manipular exceções. Por exemplo, você pode usar um interceptor para formatar a resposta de uma API, garantindo que todos os dados sejam retornados em um formato consistente. Além disso, os interceptors podem ser aplicados globalmente ou em controladores específicos, oferecendo flexibilidade na sua aplicação.
Middleware no NestJS
Os middlewares são funções que têm acesso ao objeto de requisição (req), ao objeto de resposta (res), e à próxima função de middleware no ciclo de requisição-resposta. Eles são usados para executar código, fazer alterações na requisição e na resposta, encerrar o ciclo de requisição-resposta, ou chamar a próxima função de middleware. Um exemplo comum de middleware é a autenticação, onde você verifica se um usuário está autenticado antes de permitir o acesso a determinadas rotas.
Quando usar Interceptors
Utilize interceptors quando precisar de controle sobre a resposta ou a exceção que está sendo retornada por um manipulador. Eles são ideais para tarefas como:
- Transformar dados de resposta.
- Adicionar cabeçalhos personalizados.
- Registrar informações sobre a execução de métodos.
- Manipular exceções de forma centralizada.
Por exemplo, se você deseja que todas as respostas da sua API incluam um campo de metadados, um interceptor é a escolha certa.
Quando usar Middleware
Os middlewares são mais adequados para manipulações que precisam ocorrer antes que a requisição chegue ao manipulador. Eles são frequentemente usados para:
- Autenticação e autorização.
- Registro de logs de requisições.
- Manipulação de erros antes de chegar ao manipulador.
- Modificação de objetos de requisição e resposta.
Um exemplo prático seria um middleware que verifica se um token de autenticação está presente em todas as requisições para rotas protegidas.
Exemplos práticos
Para ilustrar a diferença entre interceptor e middleware NestJS, considere um cenário onde você tem uma API que precisa registrar todas as requisições e formatar as respostas. Um middleware pode ser usado para registrar a requisição, enquanto um interceptor pode ser usado para formatar a resposta antes de enviá-la ao cliente. Isso demonstra como ambos podem trabalhar juntos, mas com responsabilidades distintas.
Implementação de Interceptors
Para implementar um interceptor no NestJS, você pode criar uma classe que implementa a interface NestInterceptor. Aqui está um exemplo simples:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class TransformInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable {
return next.handle().pipe(map(data => ({ data })));
}
}Implementação de Middleware
Para criar um middleware, você pode definir uma função que recebe os objetos de requisição e resposta, além da próxima função de middleware. Veja um exemplo:
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: Function) {
console.log('Request...');
next();
}
}Considerações Finais sobre Interceptors e Middleware
Entender a diferença entre interceptor e middleware NestJS é fundamental para a construção de aplicações robustas e escaláveis. Enquanto os interceptors são mais focados na manipulação de respostas e exceções, os middlewares são essenciais para a manipulação de requisições e autenticação. Ambos são ferramentas poderosas que, quando usadas corretamente, podem melhorar significativamente a qualidade e a segurança de suas aplicações.




