Passer au contenu

Sérialisation

La sérialisation est un processus qui intervient avant le retour des objets dans une réponse réseau. C’est un endroit approprié pour établir des règles de transformation et de désinfection des données à retourner au client. Par exemple, les données sensibles comme les mots de passe doivent toujours être exclues de la réponse. Certaines propriétés peuvent également nécessiter une transformation supplémentaire, comme l’envoi uniquement d’un sous-ensemble des propriétés d’une entité. Effectuer ces transformations manuellement peut être fastidieux et source d’erreurs, ce qui peut laisser un doute quant à la couverture de tous les cas.

Aperçu

Nest fournit une capacité intégrée pour garantir que ces opérations peuvent être effectuées de manière simple. L’intercepteur ClassSerializerInterceptor utilise le puissant package class-transformer pour fournir une méthode déclarative et extensible de transformation des objets. L’opération de base qu’il effectue est de prendre la valeur retournée par un gestionnaire de méthode et d’appliquer la fonction instanceToPlain() du package class-transformer. Ce faisant, il peut appliquer des règles exprimées par les décorateurs class-transformer sur une classe d’entité/DTO, comme décrit ci-dessous.

Exclure des propriétés

Supposons que nous souhaitions automatiquement exclure une propriété password d’une entité utilisateur. Nous annotons l’entité comme suit :

Exclure la propriété password
import { Exclude } from 'class-transformer';
export class UserEntity {
id: number;
firstName: string;
lastName: string;
@Exclude()
password: string;
constructor(partial: Partial<UserEntity>) {
Object.assign(this, partial);
}
}

Maintenant, considérons un contrôleur avec un gestionnaire de méthode qui retourne une instance de cette classe.

Contrôleur retour UserEntity
@UseInterceptors(ClassSerializerInterceptor)
@Get()
findOne(): UserEntity {
return new UserEntity({
id: 1,
firstName: 'Kamil',
lastName: 'Mysliwiec',
password: 'password',
});
}

Lorsque ce point de terminaison est demandé, le client reçoit la réponse suivante :

{
"id": 1,
"firstName": "Kamil",
"lastName": "Mysliwiec"
}

Notez que l’intercepteur peut être appliqué à l’échelle de l’application (comme couvert ici). La combinaison de l’intercepteur et de la déclaration de classe d’entité garantit que toute méthode qui retourne un UserEntity veillera à supprimer la propriété password. Cela vous offre un moyen de mise en œuvre centralisée de cette règle métier.

Exposer des propriétés

Vous pouvez utiliser le décorateur @Expose() pour fournir des noms d’alias pour les propriétés ou pour exécuter une fonction pour calculer une valeur de propriété (analogue aux fonctions getter), comme illustré ci-dessous.

Exposer une propriété fullName
@Expose()
get fullName(): string {
return `${this.firstName} ${this.lastName}`;
}

Transformer

Vous pouvez effectuer une transformation supplémentaire des données en utilisant le décorateur @Transform(). Par exemple, la construction suivante retourne la propriété nom de RoleEntity au lieu de retourner tout l’objet.

Transformations dans une entité
@Transform(({ value }) => value.name)
role: RoleEntity;

Passer des options

Vous pouvez vouloir modifier le comportement par défaut des fonctions de transformation. Pour remplacer les paramètres par défaut, passez-les dans un objet options avec le décorateur @SerializeOptions().

Passer des options
@SerializeOptions({
excludePrefixes: ['_'],
})
@Get()
findOne(): UserEntity {
return new UserEntity({});
}

Les options passant par @SerializeOptions() sont transmises comme deuxième argument de la fonction sous-jacente instanceToPlain(). Dans cet exemple, nous excluons automatiquement toutes les propriétés qui commencent par le préfixe _.

Exemple

Un exemple fonctionnel est disponible ici.

WebSockets et Microservices

Bien que ce chapitre montre des exemples utilisant des applications de style HTTP (par exemple, Express ou Fastify), le ClassSerializerInterceptor fonctionne de la même manière pour les WebSockets et les Microservices, quel que soit le mode de transport utilisé.

En savoir plus

Lisez plus sur les décorateurs et les options disponibles fournies par le package class-transformer ici.