Menu
CoddyTech

알 수 없는 필드

Coddy Node.js 여정의 TypeScript와 NestJS 섹션에 포함된 레슨. 24개 중 16번째.

클라이언트는 DTO에 전혀 언급되지 않은 필드(예: { "title": "x", "admin": true })를 보내고, 이런 필드는 아무런 처리 없이 코드에 전달될 수 있습니다. ValidationPipe에는 이런 필드를 처리하는 두 가지 옵션이 있습니다.

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

whitelist: true를 설정하면 메서드가 본문을 받기 전에 유효성 검사 데코레이터가 없는 필드가 모두 제거됩니다. forbidNonWhitelisted: true를 추가하면 파이프가 그런 본문을 거부하고, 400 오류와 함께 "property admin should not exist"를 반환합니다. forbidNonWhitelisted는 whitelist와 함께 사용할 때만 작동하며, 단독으로는 아무런 효과가 없습니다.

추가 입력을 보내는 양식이라면 조용히 제거하는 편이 적절합니다. 거부하면 API 클라이언트에 titel 같은 오타를 알려 줍니다.

challenge icon

챌린지

쉬움

클라이언트는 DTO에 전혀 언급되지 않은 "owner": "admin" 같은 필드를 보낼 수 있으며, 현재는 그런 필드가 아무런 처리 없이 코드에 전달됩니다. API가 이를 거부하도록 설정해 오타나 몰래 추가한 필드가 있는 클라이언트가 이를 알 수 있게 하세요.

  1. src/main.ts에서 bootstrap이 이미 등록한 ValidationPipe를 찾으세요. 여기에 두 가지 옵션을 전달하세요. whitelist: true는 유효성 검사 데코레이터가 없는 모든 필드를 제거하고, forbidNonWhitelisted: true는 해당 필드를 제거하는 대신 그런 본문을 400 오류로 거부합니다. 두 번째 옵션은 첫 번째 옵션과 함께 사용해야만 작동합니다.
  2. 그 외에는 아무것도 변경하지 마세요. title과 done만 있는 본문은 계속 작동하고, 잘못된 제목은 여전히 거부됩니다.

테스트해 보세요: { "title": "Book flights", "owner": "admin" }를 /tasks로 POST하세요. 400 오류가 반환됩니다.

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

그다음 { "title": "Book flights" }를 POST하세요. 201 응답과 새 작업이 반환됩니다. { "title": 7 }은 여전히 400 오류를 반환합니다.

직접 해보기

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 icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

TypeScript와 NestJS의 모든 레슨

직접 연습해 보세요: Express 플레이그라운드