Champs inconnus
Fait partie de la section TypeScript et NestJS du Journey Node.js de Coddy. Leçon 16 sur 24.
Un client peut envoyer des champs qui ne figurent jamais dans votre DTO, comme { "title": "x", "admin": true }, et ils parviennent à votre code sans modification. ValidationPipe propose deux options pour les gérer.
app.useGlobalPipes(
new ValidationPipe({ whitelist: true }),
);whitelist: true supprime chaque champ qui n’a pas de décorateur de validation avant que votre méthode ne reçoive le corps de la requête. Ajoutez forbidNonWhitelisted: true et la pipe refuse plutôt un tel corps, avec une erreur 400 et "property admin should not exist". forbidNonWhitelisted ne fonctionne qu’avec whitelist ; seule, cette option ne fait rien.
Une suppression silencieuse convient à un formulaire qui envoie des champs supplémentaires. Un refus signale au client de l’API qu’il a fait une faute de frappe, par exemple titel.
Défi
FacileUn client peut envoyer des champs que votre DTO ne mentionne jamais, comme "owner": "admin", et pour l’instant, ils arrivent dans votre code sans être modifiés. Faites en sorte que l’API les refuse, afin qu’un client qui a fait une faute de frappe ou ajouté un champ discrètement le sache.
- Dans
src/main.ts, trouvez leValidationPipequebootstrapenregistre déjà. Transmettez-lui deux options :whitelist: true, qui supprime tous les champs dépourvus de décorateur de validation, etforbidNonWhitelisted: true, qui refuse un tel corps de requête avec une erreur 400 au lieu de supprimer le champ. La seconde option ne fonctionne qu’avec la première. - Ne changez rien d’autre. Les corps contenant uniquement
titleetdonecontinueront de fonctionner, et un titre invalide sera toujours refusé.
Essayez : envoyez { "title": "Book flights", "owner": "admin" } à /tasks avec la méthode POST. Vous obtenez une erreur 400 :
{ "message": ["property owner should not exist"], "error": "Bad Request", "statusCode": 400 }Ensuite, envoyez { "title": "Book flights" } avec la méthode POST : vous obtenez une réponse 201 et la nouvelle tâche. { "title": 7 } renvoie toujours une erreur 400.
Essayez vous-même
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de TypeScript et NestJS
1Les bases de Nest
Classes et méthodesBonjour, NestEnregistrer un contrôleur4Gardes, filtres, intercepteurs
GardesEntraînez-vous par vous-même : Playground Express