Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Ein 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.

  1. Suche in src/main.ts die ValidationPipe, die bootstrap bereits registriert. Übergib ihr zwei Optionen: whitelist: true, wodurch jedes Feld ohne Validierungsdekorator entfernt wird, und forbidNonWhitelisted: 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.
  2. Ändere sonst nichts. Requests mit ausschließlich title und done funktionieren 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();
quiz iconTeste dich selbst

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