Campos desconocidos
Parte de la sección TypeScript y NestJS del Journey de Node.js de Coddy. Lección 16 de 24.
Un cliente puede enviar campos que tu DTO nunca menciona, como { "title": "x", "admin": true }, y llegan intactos a tu código. ValidationPipe tiene dos opciones para ellos.
app.useGlobalPipes(
new ValidationPipe({ whitelist: true }),
);whitelist: true elimina todos los campos que no tengan un decorador de validación antes de que tu método vea el cuerpo. Añade forbidNonWhitelisted: true y, en su lugar, el pipe rechaza ese cuerpo con un error 400 y "property admin should not exist". forbidNonWhitelisted solo funciona junto con whitelist; por sí solo no hace nada.
La eliminación silenciosa es adecuada para un formulario que envía entradas adicionales. Rechazar el cuerpo le indica al cliente de la API que hay un error tipográfico, como titel.
Desafío
FácilUn cliente puede enviar campos que tu DTO nunca menciona, como "owner": "admin", y ahora mismo llegan intactos a tu código. Haz que la API los rechace, para que un cliente que cometa un error tipográfico o añada un campo sospechoso se dé cuenta.
- En
src/main.ts, busca elValidationPipequebootstrapya registra. Pásale dos opciones:whitelist: true, que elimina todos los campos sin un decorador de validación, yforbidNonWhitelisted: true, que rechaza ese tipo de cuerpo con 400 en lugar de eliminar el campo. La segunda opción solo funciona junto con la primera. - No cambies nada más. Los cuerpos que solo tengan
titleydoneseguirán funcionando, y un título no válido seguirá siendo rechazado.
Pruébalo: envía POST { "title": "Book flights", "owner": "admin" } a /tasks. Obtendrás 400:
{ "message": ["property owner should not exist"], "error": "Bad Request", "statusCode": 400 }Luego envía POST { "title": "Book flights" }: 201 y la nueva tarea. { "title": 7 } seguirá dando 400.
Pruébalo tú mismo
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();
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de TypeScript y NestJS
1Fundamentos de Nest
Clases y métodosHola, NestRegistro de un controlador4Guards, filtros e interceptores
GuardsPractica por tu cuenta: Playground de Express