创建任务
本课属于 Coddy Node.js 学习旅程的“TypeScript 和 NestJS”单元。第 6 课,共 24 课。
创建任务的客户端会在请求正文中以 JSON 格式发送任务,并且需要取回保存后的任务。
@Post()
create(@Body() review: { stars: number }) {
this.reviews.push(review);
return review;
}@Post() 会将控制器路径上的 POST 请求映射到这个方法,@Body() 会把解析后的 JSON 传给它。Nest 会自动读取 JSON 请求正文,因此不需要添加 express.json()。
Nest 会用 201 Created 响应 POST 请求,这个状态表示新资源已创建;其他所有方法都会返回 200。在方法上添加 @HttpCode(200) 可以更改状态码;创建资源时,保持默认状态码即可。
挑战
简单客户端需要添加任务,而不只是读取任务。添加一个路由,根据客户端发送的 JSON 创建任务。
- 在
src/tasks/tasks.controller.ts中,为TasksController添加一个方法(命名为create),用于处理POST /tasks。用@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 在线编辑器