Saltar al contenido

Cómo excluir el campo de entidad de lo devuelto por el controlador JSON. NestJS + Typeorm

Posterior a indagar en varios repositorios y páginas de internet al terminar nos encontramos con la respuesta que te compartimos ahora.

Solución:

Sugeriría crear un interceptor que aproveche la biblioteca de transformadores de clase:

@Injectable()
export class TransformInterceptor implements NestInterceptor 
  intercept(
    context: ExecutionContext,
    call$: Observable,
  ): Observable 
    return call$.pipe(map(data => classToPlain(data)));
  

Luego, simplemente excluya propiedades usando @Exclude() decorador, por ejemplo:

import  Exclude  from 'class-transformer';

export class User 
    id: number;
    email: string;

    @Exclude()
    password: string;

Puede sobrescribir el método toJSON del modelo de esta manera.

@Entity()
export class User extends BaseAbstractEntity implements IUser 
  static passwordMinLength: number = 7;

  @ApiModelProperty( example: faker.internet.email() )
  @IsEmail()
  @Column( unique: true )
  email: string;

  @IsOptional()
  @IsString()
  @MinLength(User.passwordMinLength)
  @Exclude( toPlainOnly: true )
  @Column( select: false )
  password: string;

  @IsOptional()
  @IsString()
  @Exclude( toPlainOnly: true )
  @Column( select: false )
  passwordSalt: string;

  toJSON() 
    return classToPlain(this);
  

  validatePassword(password: string)  !this.passwordSalt) 
      return false;
    
    return comparedToHashed(password, this.password, this.passwordSalt);
  

Usando el método de transformador de clase de plainToClass junto con el @Excluir( a Solo simple: true ), la contraseña se excluirá de la respuesta JSON, pero estará disponible en la instancia del modelo. Me gusta esta solución porque mantiene toda la configuración del modelo en la entidad.

Como complemento a la respuesta de Kamil:

En lugar de crear su propio interceptor, ahora puede usar el integrado ClassSerializerInterceptorconsulte los documentos de serialización.

@UseInterceptors(ClassSerializerInterceptor)

Puede usarlo en una clase de controlador o en sus métodos individuales. Cada entidad devuelta por dicho método se transformará con class-transformer y, por lo tanto, tomará el @Exclude anotaciones en cuenta:

import  Exclude  from 'class-transformer';

export class User 
    /** other properties */    

    @Exclude()
    password: string;


Puede personalizar su comportamiento definiendo @SerializeOptions() en su controlador o sus métodos:

@SerializeOptions(
  excludePrefixes: ['_'],
  groups: ['admin']
)

para, por ejemplo, exponer ciertos campos solo a ciertos usuarios:

@Expose( groups: ["admin"] )
adminInfo: string;

Reseñas y calificaciones del post

Al final de todo puedes encontrar las referencias de otros desarrolladores, tú aún tienes la opción de mostrar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *