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.
Desafio
FácilUm 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.
- Em
src/main.ts, encontre oValidationPipequebootstrapjá registra. Passe a ele duas opções:whitelist: true, que remove todos os campos sem um decorador de validação, eforbidNonWhitelisted: 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. - Não altere mais nada. Corpos que contenham apenas
titleedonecontinuam 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();
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
1Fundamentos do Nest
Classes e métodosOlá, NestRegistrando um controller4Guardas, filtros e interceptadores
GuardasPratique por conta própria: Playground de Express