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.
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.
- Trong
src/tasks/tasks.controller.ts, thêm một phương thức vàoTasksController(đặt tên làcreate) choPOST /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. - Tạo tác vụ mới từ
titletrong phần thân. Đặtidsao cho không trùng với tác vụ nào khác: lớn hơn id lớn nhất trongthis.tasksmột đơn vị. Tác vụ mới luôn chưa hoàn thành, nêndonelàfalse. - Thêm tác vụ vào
this.tasksđểGET /tasksvàGET /tasks/:idcó thể tìm thấy tác vụ đó sau này. Trả về tác vụ mới. - Đừ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
1Nest cơ bản
Lớp và phương thứcXin chào, NestĐăng ký controller4Bộ bảo vệ, bộ lọc và bộ đánh chặn
Bộ bảo vệTự luyện tập: Playground Express