Menu
CoddyTech

你好,Nest

本课属于 Coddy Node.js 学习旅程的“TypeScript 和 NestJS”单元。第 2 课,共 24 课。

在 Express 中,每个路由都是你手动注册的函数。NestJS 会为 API 的每个部分提供单独的类,并通过装饰器告诉 Nest 每个类的作用。

@Controller('books')
export class BooksController {
    @Get()
    findAll() {
        return [{ title: 'Dune' }];
    }
}

控制器负责处理某个路径的请求。@Controller('books') 和 @Get() 是装饰器。装饰器以 @ 开头,写在类或方法上方的一行,用来告诉 Nest 它的用途。Nest 的装饰器总是以 () 结尾,即使括号里什么也没有。它们共同将 findAll 映射到 GET /books,Nest 会将方法的返回值作为 JSON 发送,状态码为 200。Nest 绝不会将请求发送给没有路由装饰器的方法。

模块会列出归为一组的类。src/main.ts 会调用 NestFactory.create(AppModule);AppModule 会导入 TasksModule,而 TasksModule 会列出 TasksController。在笔记本电脑上,你可以用 npm run start 启动它;这里由“运行”按钮来启动。

在起始代码中,interface Task 描述任务对象的字段,Task[] 表示由这类对象组成的数组。private 会将字段限制在所属的类中。方法括号后面的类型描述它的返回值。这些类型注解可以帮助 TypeScript 检查你的代码,而 Nest 的装饰器则定义路由。

challenge icon

挑战

简单

你的第一个 Nest 服务器已经保存了 3 个任务,但还没有路由返回它们。添加一个列出这些任务的路由。

  1. 打开 src/tasks/tasks.controller.ts。类 TasksController 将任务列表保存在 this.tasks 中。类上方的 @Controller('tasks') 让它负责处理 /tasks 下的路径。
  2. 在注释所在的位置添加一个方法(命名为 findAll),并用 @Get() 标记它。该方法返回 this.tasks。Nest 会将方法的返回值作为 JSON 发送,状态码为 200。
  3. Get 和 Controller 一样,来自 @nestjs/common。将它添加到第一行的导入中。

试试看:按“运行”,然后发送 GET /tasks。你会得到状态码 200 和这 3 个任务:

[
  { "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 /task,注意少了 s。没有路由匹配这个路径,因此 Nest 会返回 404:

{ "message": "Cannot GET /task", "error": "Not Found", "statusCode": 404 }

亲手试试

import { Controller } 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 /tasks 请求并返回列表。
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

TypeScript 和 NestJS中的所有课

自己练习: Express 在线编辑器