Menu
CoddyTech

Campos desconhecidos

Parte da seção TypeScript e NestJS do Journey de Node.js da Coddy. Lição 16 de 24.

Um cliente pode enviar campos que seu DTO nunca menciona, como { "title": "x", "admin": true }, e eles chegam intactos ao seu código. ValidationPipe tem duas opções para esses campos.

app.useGlobalPipes(
    new ValidationPipe({ whitelist: true }),
);

whitelist: true remove todos os campos que não têm um decorador de validação antes que seu método receba o corpo. Adicione forbidNonWhitelisted: true e o pipe recusa esse corpo, em vez disso, com 400 e "property admin should not exist". forbidNonWhitelisted só funciona junto com whitelist; sozinho, não faz nada.

Remover silenciosamente é adequado para um formulário que envia entradas extras. Recusar informa ao cliente da API sobre um erro de digitação, como titel.

challenge icon

Desafio

Fácil

Um cliente pode enviar campos que seu DTO nunca menciona, como "owner": "admin", e, no momento, eles chegam intactos ao seu código. Faça a API recusá-los, para que um cliente com um erro de digitação ou um campo extra suspeito perceba.

  1. Em src/main.ts, encontre o ValidationPipe que bootstrap já registra. Passe a ele duas opções: whitelist: true, que remove todos os campos sem um decorador de validação, e forbidNonWhitelisted: true, que recusa esse corpo com o status 400 em vez de remover o campo. A segunda opção só funciona junto com a primeira.
  2. Não altere mais nada. Corpos que contenham apenas title e done continuam funcionando, e um título inválido ainda é recusado.

Teste: envie um POST com { "title": "Book flights", "owner": "admin" } para /tasks. Você recebe 400:

{ "message": ["property owner should not exist"], "error": "Bad Request", "statusCode": 400 }

Depois, envie um POST com { "title": "Book flights" }: 201 e a nova tarefa. { "title": 7 } ainda recebe 400.

Experimente você mesmo

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 seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de TypeScript e NestJS

Pratique por conta própria: Playground de Express