La création d'un nouvel utilisateur ignorera les objets non spécifiés de create-user.dto.ts
Cependant, lorsque je mets à jour l'utilisateur, il ajoutera des champs indésirables comme celui-ci:
XXX
Ceci est l'action de mise à jour du service utilisateur
// Unwanted junk from client
{
"email": "newemail@gmail.com",
"junk": "junk"
}
Et voici le user.controller.ts
@Patch()
@UsePipes(CustomValidationPipe)
async update(@Body() data: UpdateUserDto) {
return this.userService.update(data);
}
Les données du correctif client:
// user.service.ts
async update(data: UpdateUserDto) {
try {
this.logger.log(data);
const id = '5c6dd9852d4f441638c2df86';
const user = await this.userRepository.update(id, data);
return { message: 'Updated your information' };
} catch (error) {
this.logger.log(error);
throw new HttpException('', HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Le email sera mis à jour correctement mais la ligne aura une nouvelle propriété indésirable code> junk avec la valeur junk
3 Réponses :
J'ai trouvé la solution:
Voici à quoi devrait ressembler user.service.ts update ():
async update(data: UpdateUserDto) {
this.logger.log(data);
// added for testing purposes (id should be based on active user)
const id = '5c6ef2c823bf4e3414d65cd0';
const user = await this.userRepository.create(data);
await this.userRepository.update(id, user);
return { message: 'Updated your information' };
}
doit être ajouté avant
await this.userRepository.update(id, user);
Voici la mise à jour complète de user.service.ts ()
const user = await this.userRepository.create(data);
Désormais, aucune propriété indésirable ne sera ajoutée à la ligne
Je suppose que vous utilisez la méthode validate de class-transformer dans votre CustomValidationPipe .
Lorsque vous passez le whitelist , validate supprimera toutes les propriétés inconnues (-> aucune annotation dans votre classe DTO):
@IsString() lastName: string; @ValidateNested() @Type(() => Address) address: Address
Si vous souhaitez renvoyer une erreur de validation au lieu de simplement supprimer les propriétés inconnues, vous pouvez également passer l'option interditNonWhitelisted .
validate(userUpdate, { whitelist: true, forbidNonWhitelisted: true });
Dans le cas d'une mise à jour, vous voudrez probablement aussi utiliser skipMissingProperties: true , afin que validate ne lève pas d'erreur, lorsque par exemple lastName ne fait pas partie de la mise à jour.
Notez que vous devez annoter toutes les propriétés de votre classe dto, pour que la validation fonctionne correctement:
XXX
Excellente réponse. Exactement ce que je cherchais!
Je ne sais pas quand ce comportement / cette option a été ajouté à NestJS (peut-être a-t-il été ajouté après la question d'origine et la réponse acceptée), mais le meilleur moyen de supprimer les propriétés inconnues serait que:
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
}),
);
C'est ça. En vous assurant simplement d'avoir whitelist: true dans votre configuration, vous n'obtiendrez aucune propriété inconnue / invalide.
Vous pouvez également arrêter complètement la demande en définissant une autre propriété appelé interditNonWhitelisted à true.
Pour en savoir plus: https://docs.nestjs.com/techniques/validation#stripping-properties