Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Exclude não evita que um dado seja salvo no Redis

Quando estamos usando o cache no Redis em algum endpoint e implementamos o exclude em determinado dados na entidade, apenas a primeira requisição retorna o payload sem o campo qual tem o @Exclude(), nas próximas (qual a requisição não bate no banco mas sim no Redis), o campo volta a aparecer.

Consegui contornar usando a opção select: false no Column decorator. Porém, ele não funciona no decorator PrimaryGeneratedColumn, apenas o exclude funciona (porém, com o Redis, traz o problema citado acima).

Como eu poderia fazer com que o Exclude tbm indicasse para sistema de cache que ele não deve salvar aquele campo no db de cache?

1 resposta
solução!

Oi Wilson! Tudo bem?

Realmente, o @Exclude() do class-transformer é utilizado para ocultar campos na serialização de respostas, mas ele não impede que esses campos sejam armazenados no cache do Redis.

Para resolver esse problema, uma abordagem seria manipular os dados antes de armazená-los no cache. Você pode fazer isso manualmente, removendo os campos indesejados antes de salvar no Redis. Aqui está um exemplo prático de como você pode fazer isso:

  1. Interceptar a resposta antes de armazenar no Redis: Você pode criar um interceptor que irá manipular a resposta antes de ela ser armazenada no Redis.

  2. Remover campos indesejados: No interceptor, você pode remover os campos que não deseja armazenar no cache.

Aqui está um exemplo de como você pode implementar isso:

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class CacheInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      map(data => {
        // Remova os campos indesejados aqui
        if (data && data.senha) {
          delete data.senha;
        }
        return data;
      }),
    );
  }
}
  1. Aplicar o interceptor: Você pode aplicar esse interceptor globalmente ou apenas nos endpoints onde você utiliza o Redis.
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';

@Module({
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: CacheInterceptor,
    },
  ],
})
export class AppModule {}

Dessa forma, você garante que os campos indesejados não sejam armazenados no Redis, contornando o problema que você mencionou.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.