web-dev-qa-db-fra.com

Comment exclure le champ d'entité de retourné par le contrôleur JSON. NestJS + Typeorm

Je souhaite exclure le champ de mot de passe du JSON renvoyé. J'utilise NestJS et Typeorm.

La solution fournie sur cette question ne fonctionne pas pour moi ou dans NestJS. Je peux poster mon code si besoin. D'autres idées ou solutions? Merci.

10

Je suggère de créer un intercepteur qui tire parti de la bibliothèque class-transformer :

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

Ensuite, excluez simplement les propriétés à l'aide de @Exclude() decorator, par exemple:

import { Exclude } from 'class-transformer';

export class User {
    id: number;
    email: string;

    @Exclude()
    password: string;
}
10
Kamil Myśliwiec

Vous pouvez remplacer la méthode toJSON du modèle comme ceci.

@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) {
    if (!this.password || !this.passwordSalt) {
      return false;
    }
    return comparedToHashed(password, this.password, this.passwordSalt);
  }
}

En utilisant la méthode de transformation de classe de plainToClass avec @ Exclude ({toPlainOnly: true}), le mot de passe sera exclu de la réponse JSON, mais sera disponible dans l'instance de modèle. J'aime cette solution car elle conserve toute la configuration du modèle dans l'entité.

En complément de réponse de Kamil :

Au lieu de créer votre propre intercepteur, vous pouvez maintenant utiliser le ClassSerializerInterceptor intégré, voir documentation de sérialisation .

@UseInterceptors(ClassSerializerInterceptor)

Vous pouvez l'utiliser sur une classe de contrôleur ou ses méthodes individuelles. Chaque entité retournée par une telle méthode sera transformée avec class-transformer.


Vous pouvez personnaliser son comportement en définissant @SerializeOptions() sur votre contrôleur ou ses méthodes:

@SerializeOptions({
  excludePrefixes: ['_'],
  groups: ['admin']
})
4
Kim Kern

Vous pouvez utiliser le package https://github.com/typestack/class-transformer

Vous pouvez exclure une propriété à l'aide de décorateurs et également, vous pouvez exclure des propriétés à l'aide de groupes.

0
João Silva