Menu
CoddyTech

Привет, Nest

Часть раздела TypeScript и NestJS путешествия по Node.js на Coddy. Урок 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, в котором перечислен TasksController. На ноутбуке вы бы запустили его командой npm run start; здесь это делает кнопка «Запустить».

В стартовом проекте interface Task описывает поля объекта задачи, а Task[] означает массив таких объектов. private оставляет поле внутри своего класса. Тип после скобок метода описывает возвращаемое им значение. Эти аннотации помогают TypeScript проверять ваш код; декораторы Nest определяют маршруты.

challenge icon

Задание

Легко

Твой первый сервер Nest уже содержит три задачи, но пока ни один маршрут их не возвращает. Добавь маршрут, который выводит их список.

  1. Открой src/tasks/tasks.controller.ts. В классе TasksController хранится список в this.tasks. @Controller('tasks') над классом отвечает за пути, начинающиеся с /tasks.
  2. На месте комментария добавь метод (назови его findAll) и пометь его декоратором @Get(). Он возвращает this.tasks. Nest отправляет то, что возвращает метод, в формате JSON со статусом 200.
  3. Get импортируется из @nestjs/common, как и Controller. Добавь его в импорт в первой строке.

Проверь: нажми «Запустить», затем отправь GET /tasks. Ты получишь статус 200 и три задачи:

[
  { "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