Menu
CoddyTech

Сервис

Часть раздела TypeScript и NestJS путешествия по Node.js на Coddy. Урок 6 из 17.

Контроллер хранит сами задачи, поэтому другие части приложения не могут получить к ним доступ. Данные и логика должны находиться в провайдере: классе, который Nest создаёт и передаёт тому, кто его запрашивает.

@Injectable()
export class BooksService {
    private books = [{ title: 'Dune' }];
}

@Controller('books')
export class BooksController {
    constructor(private readonly booksService: BooksService) {}
}

@Injectable() помечает класс, а модуль указывает его в providers. Класс запрашивает провайдер, указывая его в конструкторе: это внедрение зависимостей. Nest считывает тип параметра, который компилятор сохраняет для декорированных классов, создаёт один экземпляр для всего приложения и передаёт этот же экземпляр каждому классу, который его запрашивает. Данные используются совместно, а в тесте вместо провайдера можно передать поддельный объект.

Этот урок начинается с того, что контроллер уже вызывает this.tasksService.

challenge icon

Задание

Легко
  • Сделай TasksService внедряемым, добавь в него create(title) и remove(id) — работу, которую выполнял твой контроллер в уроке 5, — и укажи его в providers у TasksModule.
  • Запроси его в конструкторе TasksController.
  • Отправь POST /tasks с { "title": "Buy milk" }, затем GET /tasks, а потом DELETE /tasks/99.

Попробуйте сами

import { NotFoundException } from '@nestjs/common';

export interface Task {
    id: number;
    title: string;
    done: boolean;
    createdAt?: string;
}

// Сделайте этот класс провайдером, который Nest сможет внедрять.
export class TasksService {
    private tasks: Task[] = [
        { id: 1, title: 'Write the README', done: true, createdAt: '2026-01-05T09:00:00.000Z' },
        { id: 2, title: 'Fix the login bug', done: false, createdAt: '2026-01-06T14:30:00.000Z' },
        { id: 3, title: 'Plan the sprint', done: false, createdAt: '2026-01-07T08:15:00.000Z' },
    ];

    findAll(done?: string): Task[] {
        if (done === undefined) {
            return this.tasks;
        }
        return this.tasks.filter((task) => task.done === (done === 'true'));
    }

    findOne(id: number): Task {
        const task = this.tasks.find((task) => task.id === id);
        if (!task) {
            throw new NotFoundException(`Task ${id} not found`);
        }
        return task;
    }

    // Перенесите сюда из контроллера логику создания и удаления.
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела TypeScript и NestJS