Menu
CoddyTech

작업 생성하기

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

작업을 생성하는 클라이언트는 요청 본문에 JSON 형식으로 작업을 보내고, 저장된 작업을 응답으로 받아야 합니다.

@Post()
create(@Body() review: { stars: number }) {
    this.reviews.push(review);
    return review;
}

@Post()는 컨트롤러 경로의 POST를 메서드에 연결하고, @Body()는 파싱된 JSON을 전달합니다. Nest는 JSON 본문을 자체적으로 읽으므로 추가할 express.json()은 없습니다.

Nest는 POST 요청에 새 리소스가 생성되었음을 나타내는 상태 코드인 201 Created로 응답하고, 다른 모든 메서드에는 200으로 응답합니다. 메서드에 @HttpCode(200)을 지정하면 상태 코드가 바뀝니다. 리소스를 생성할 때는 그대로 두세요.

challenge icon

챌린지

쉬움

클라이언트는 작업을 읽기만 하는 것이 아니라 추가할 수도 있어야 합니다. 클라이언트가 보내는 JSON으로 작업을 생성하는 경로를 추가하세요.

  1. src/tasks/tasks.controller.ts에서 TasksController에 POST /tasks를 처리하는 메서드(create라고 부르세요)를 추가하세요. @Post()로 표시하고, 매개변수에 @Body()를 사용해 JSON 본문을 읽으세요. 둘 다 @nestjs/common에서 가져옵니다.
  2. 본문의 title을 사용해 새 작업을 만드세요. 다른 작업에는 없는 id를 부여하세요. this.tasks에서 가장 큰 id보다 1 크게 하면 됩니다. 새 작업은 완료된 상태일 수 없으므로 done은 false입니다.
  3. 작업을 this.tasks에 추가해 GET /tasks와 GET /tasks/:id에서 나중에 찾을 수 있게 하세요. 새 작업을 반환하세요.
  4. 상태를 직접 설정하지 마세요. Nest는 POST에 대해 자체적으로 201 Created를 응답합니다.

테스트해 보세요: POST와 경로 /tasks, 본문 { "title": "Buy milk" }를 선택하세요. 201 응답과 다음 결과를 받습니다.

{ "id": 4, "title": "Buy milk", "done": false }

GET /tasks/4를 보내면 같은 작업이 반환됩니다. 그런 다음 빈 본문 {}으로 POST를 보내세요. 아직 본문을 검사하는 부분이 없으므로 제목이 없는 작업과 함께 여전히 201 응답을 받습니다. { "id": 5, "done": false }. 검증 장에서 이 문제를 해결합니다.

직접 해보기

import { Controller, Get, Param, Query } from '@nestjs/common';

interface Task {
    id: number;
    title: string;
    done: boolean;
}

@Controller('tasks')
export class TasksController {
    private tasks: Task[] = [
        { id: 1, title: 'Write the README', done: true },
        { id: 2, title: 'Fix the login bug', done: false },
        { id: 3, title: 'Plan the sprint', done: false },
    ];

    @Get()
    findAll(@Query('done') done?: string): Task[] {
        if (done === undefined) {
            return this.tasks;
        }
        return this.tasks.filter((task) => task.done === (done === 'true'));
    }

    @Get(':id')
    findOne(@Param('id') id: string): Task | undefined {
        return this.tasks.find((task) => task.id === Number(id));
    }
}

TypeScript와 NestJS의 모든 레슨

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