Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

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

  1. En src/main.ts, busca el ValidationPipe que bootstrap ya registra. Pásale dos opciones: whitelist: true, que elimina todos los campos sin un decorador de validación, y forbidNonWhitelisted: 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.
  2. No cambies nada más. Los cuerpos que solo tengan title y done seguirá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();
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de TypeScript y NestJS

Practica por tu cuenta: Playground de Express