Unbekannte Felder
Teil des Abschnitts TypeScript und NestJS der Node.js-Journey von Coddy. Lektion 16 von 24.
Ein Client kann Felder senden, die in deinem DTO nicht vorkommen, etwa { "title": "x", "admin": true }, und sie gelangen unverändert in deinen Code. ValidationPipe bietet dafür zwei Optionen.
app.useGlobalPipes(
new ValidationPipe({ whitelist: true }),
);whitelist: true entfernt jedes Feld ohne Validierungs-Dekorator, bevor deine Methode den Body sieht. Füge forbidNonWhitelisted: true hinzu, und die Pipe weist einen solchen Body stattdessen mit 400 und "property admin should not exist" zurück. forbidNonWhitelisted funktioniert nur zusammen mit whitelist; allein bewirkt es nichts.
Stilles Entfernen eignet sich für ein Formular, das zusätzliche Eingaben sendet. Eine Zurückweisung weist einen API-Client auf seinen Tippfehler hin, etwa titel.
Aufgabe
EinfachEin Client kann Felder senden, die in deinem DTO nie erwähnt werden, etwa "owner": "admin", und im Moment gelangen sie unverändert in deinen Code. Weise die API an, solche Felder abzulehnen, damit ein Client mit einem Tippfehler oder einem zusätzlichen, verdächtigen Feld davon erfährt.
- Suche in
src/main.tsdieValidationPipe, diebootstrapbereits registriert. Übergib ihr zwei Optionen:whitelist: true, wodurch jedes Feld ohne Validierungsdekorator entfernt wird, undforbidNonWhitelisted: true, wodurch ein solcher Request-Body mit 400 abgelehnt wird, statt das Feld zu entfernen. Die zweite Option funktioniert nur in Verbindung mit der ersten. - Ändere sonst nichts. Requests mit ausschließlich
titleunddonefunktionieren weiterhin, und ein ungültiger Titel wird nach wie vor abgelehnt.
Probiere es aus: Sende per POST { "title": "Book flights", "owner": "admin" } an /tasks. Du erhältst 400:
{ "message": ["property owner should not exist"], "error": "Bad Request", "statusCode": 400 }Sende dann per POST { "title": "Book flights" }: 201 und die neue Aufgabe. { "title": 7 } ergibt weiterhin 400.
Probier es selbst
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();
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in TypeScript und NestJS
Übe selbstständig: Express-Playground