Campi sconosciuti
Fa parte della sezione TypeScript e NestJS del percorso Node.js di Coddy. Lezione 16 di 24.
Un client può inviare campi che il tuo DTO non menziona mai, come { "title": "x", "admin": true }, e questi raggiungono il tuo codice senza modifiche. ValidationPipe ha due opzioni per gestirli.
app.useGlobalPipes(
new ValidationPipe({ whitelist: true }),
);whitelist: true rimuove ogni campo che non ha un decoratore di validazione prima che il metodo riceva il corpo della richiesta. Aggiungi forbidNonWhitelisted: true e la pipe rifiuterà invece un corpo di questo tipo, restituendo un errore 400 e "property admin should not exist". forbidNonWhitelisted funziona solo insieme a whitelist; da solo non fa nulla.
La rimozione silenziosa è adatta a un modulo che invia campi aggiuntivi. Il rifiuto segnala a un client API un errore di battitura, come titel.
Sfida
FacileUn client può inviare campi che il tuo DTO non menziona mai, come "owner": "admin", e al momento questi arrivano intatti al tuo codice. Fai in modo che l’API li rifiuti, così un client con un refuso o un campo extra sospetto se ne accorge.
- In
src/main.ts, trova ilValidationPipechebootstrapregistra già. Passagli due opzioni:whitelist: true, che rimuove ogni campo senza un decoratore di convalida, eforbidNonWhitelisted: true, che rifiuta il corpo della richiesta con 400 invece di rimuovere il campo. La seconda opzione funziona solo insieme alla prima. - Non modificare nient’altro. I corpi con solo
titleedonecontinuano a funzionare, e un titolo non valido viene comunque rifiutato.
Prova: invia POST { "title": "Book flights", "owner": "admin" } a /tasks. Ottieni 400:
{ "message": ["property owner should not exist"], "error": "Bad Request", "statusCode": 400 }Poi invia POST { "title": "Book flights" }: 201 e la nuova attività. { "title": 7 } continua a restituire 400.
Provalo tu
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();
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di TypeScript e NestJS
Esercitati da solo: Playground Express