Menu
CoddyTech

Tạo tác vụ

Thuộc phần TypeScript và NestJS trong hành trình Node.js của Coddy. Bài học 6 trên 24.

Một client tạo tác vụ sẽ gửi tác vụ đó dưới dạng JSON trong phần thân yêu cầu và cần nhận lại tác vụ đã lưu.

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

@Post() ánh xạ POST trên đường dẫn của controller tới phương thức, còn @Body() chuyển JSON đã phân tích cú pháp cho phương thức đó. Nest tự đọc phần thân JSON, nên bạn không cần thêm express.json().

Nest trả lời yêu cầu POST bằng 201 Created, mã trạng thái cho biết một tài nguyên mới đã tồn tại, và trả lời mọi phương thức khác bằng 200. Thêm @HttpCode(200) vào phương thức sẽ thay đổi mã trạng thái này; với thao tác tạo mới, hãy giữ nguyên.

challenge icon

Thử thách

Dễ

Client cần thêm tác vụ, chứ không chỉ đọc chúng. Thêm một route để tạo tác vụ từ JSON mà client gửi.

  1. Trong src/tasks/tasks.controller.ts, thêm một phương thức vào TasksController (đặt tên là create) cho POST /tasks. Đánh dấu phương thức bằng @Post(), rồi đọc phần thân JSON bằng @Body() trên tham số của phương thức. Cả hai đều có trong @nestjs/common.
  2. Tạo tác vụ mới từ title trong phần thân. Đặt id sao cho không trùng với tác vụ nào khác: lớn hơn id lớn nhất trong this.tasks một đơn vị. Tác vụ mới luôn chưa hoàn thành, nên done là false.
  3. Thêm tác vụ vào this.tasks để GET /tasks và GET /tasks/:id có thể tìm thấy tác vụ đó sau này. Trả về tác vụ mới.
  4. Đừng tự đặt trạng thái. Nest tự phản hồi POST với trạng thái 201 Created.

Thử nhé: chọn POST, đường dẫn /tasks và phần thân { "title": "Buy milk" }. Bạn nhận được 201 và:

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

Gửi GET /tasks/4: bạn nhận được cùng tác vụ đó. Sau đó POST với phần thân rỗng, {}. Hiện chưa có gì kiểm tra phần thân, nên bạn vẫn nhận được 201, cùng một tác vụ không có tiêu đề: { "id": 5, "done": false }. Chương Validation sẽ khắc phục điều đó.

Tự làm thử

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));
    }
}

Tất cả bài học trong TypeScript và NestJS

Tự luyện tập: Playground Express