파싱 파이프
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도 같은 방식으로 작동합니다.
챌린지
쉬움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));
}
}