Menu
CoddyTech

创建任务

本课属于 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) 可以更改状态码;创建资源时,保持默认状态码即可。

challenge icon

挑战

简单

客户端需要添加任务,而不只是读取任务。添加一个路由,根据客户端发送的 JSON 创建任务。

  1. 在 src/tasks/tasks.controller.ts 中,为 TasksController 添加一个方法(命名为 create),用于处理 POST /tasks。用 @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 在线编辑器