Menu
CoddyTech

파싱 파이프

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

GET /tasks/abc는 404 "Task NaN not found"를 반환하지만, 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 "Validation failed (numeric string is expected)"를 반환하고 메서드는 실행되지 않습니다. 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의 모든 레슨