Menu
CoddyTech

파싱 파이프

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

GET /tasks/abc는 404 "작업 NaN을 찾을 수 없음"으로 응답하지만, abc는 애초에 ID가 아닙니다. 잘못된 요청이므로 400이어야 합니다. 파이프는 검사뿐 아니라 변환도 할 수 있습니다.

@Get()
findAll(@Query('year', ParseIntPipe) year: number) {
    return this.reportsService.forYear(year);
}

매개변수 데코레이터의 두 번째 인수로 전달된 ParseIntPipe는 메서드가 실행되기 전에 텍스트를 숫자로 변환합니다. GET /reports?year=2026는 숫자 2026을 전달하므로, 이제 year: number가 참이 됩니다. ?year=soon은 400 "유효성 검사 실패(숫자 문자열이 필요함)"으로 응답하고 메서드는 실행되지 않습니다. ParseBoolPipe와 ParseUUIDPipe도 같은 방식으로 작동합니다.

challenge icon

챌린지

쉬움
  • GET /tasks/abc와 DELETE /tasks/abc는 400을 반환합니다.
  • 숫자 ID는 이전과 같이 작동하며, 존재하지 않는 ID는 여전히 404를 반환합니다.
  • GET /tasks/abc를 보낸 다음, GET /tasks/1을 보내고, 이어서 GET /tasks/9999를 보내세요.

직접 해보기

import { Body, Controller, Delete, Get, HttpCode, Inject, Param, Post, Query } from '@nestjs/common';
import { CreateTaskDto } from './dto/create-task.dto';
import { Task, TasksService } from './tasks.service';

@Controller('tasks')
export class TasksController {
    constructor(
        private readonly tasksService: TasksService,
        @Inject('PAGE_SIZE') private readonly pageSize: number,
    ) {}

    @Get()
    findAll(@Query('done') done?: string, @Query('page') page = '1') {
        const tasks = this.tasksService.findAll(done);
        const current = Number(page);
        const start = (current - 1) * this.pageSize;
        return {
            items: tasks.slice(start, start + this.pageSize),
            page: current,
            total: tasks.length,
            pages: Math.ceil(tasks.length / this.pageSize),
        };
    }

    @Get(':id')
    findOne(@Param('id') id: string): Task {
        return this.tasksService.findOne(Number(id));
    }

    @Post()
    create(@Body() dto: CreateTaskDto): Task {
        return this.tasksService.create(dto);
    }

    @Delete(':id')
    @HttpCode(204)
    remove(@Param('id') id: string): void {
        this.tasksService.remove(Number(id));
    }
}

TypeScript와 NestJS의 모든 레슨

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