작업 생성하기
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)을 지정하면 상태 코드가 바뀝니다. 리소스를 생성할 때는 그대로 두세요.
챌린지
쉬움클라이언트는 작업을 읽기만 하는 것이 아니라 추가할 수도 있어야 합니다. 클라이언트가 보내는 JSON으로 작업을 생성하는 경로를 추가하세요.
src/tasks/tasks.controller.ts에서TasksController에POST /tasks를 처리하는 메서드(create라고 부르세요)를 추가하세요.@Post()로 표시하고, 매개변수에@Body()를 사용해 JSON 본문을 읽으세요. 둘 다@nestjs/common에서 가져옵니다.- 본문의
title을 사용해 새 작업을 만드세요. 다른 작업에는 없는id를 부여하세요.this.tasks에서 가장 큰 id보다 1 크게 하면 됩니다. 새 작업은 완료된 상태일 수 없으므로done은false입니다. - 작업을
this.tasks에 추가해GET /tasks와GET /tasks/:id에서 나중에 찾을 수 있게 하세요. 새 작업을 반환하세요. - 상태를 직접 설정하지 마세요. 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 플레이그라운드