Внедрение сервиса в Nest
Пусть список готовит отдельный класс, а метод страницы об этом классе не знает. Адрес открывается, но данные в ответ не попадают: контроллеру неоткуда их взять.
Готовый сервис приходит в контроллер снаружи. В конструкторе класс называет тип, который ему нужен, а фреймворк создаёт объект этого типа и передаёт его в параметр. Такую передачу называют внедрение зависимостей. Зависимость - сервис, без которого странице нечего вернуть. Внедрение - тот момент, когда готовый объект приходит в контроллер снаружи.
Откуда Nest берёт объект, видно
по типу параметра. Тот же класс
должен быть записан в провайдерах
модуля. Фреймворк создаёт по этой
записи объект и подставляет его,
когда собирает контроллер. Пометка
private у параметра делает
его полем: метод страницы достаёт
сервис через this, вызывает
нужную операцию и отдаёт результат
клиенту. Сам адрес только выбирает
метод, а данные уже лежат
во внедрённом сервисе.
Обе записи называют один класс. Тип в конструкторе говорит, что нужно контроллеру. Список провайдеров говорит, что этот класс разрешено создать. Если в провайдерах его нет, в параметр нечего положить, и контроллер не соберётся.
Покажем на примере списка постов. Опишем сервис:
import { Injectable } from '@nestjs/common';
@Injectable()
export class PostService {
getPosts(): string {
return 'All posts';
}
}
В конструкторе контроллера укажем тип сервиса. Метод страницы вызовет его операцию и вернёт результат клиенту:
import { Controller, Get } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller()
export class PostController {
constructor(private postService: PostService) {}
@Get('posts')
getPosts(): string {
return this.postService.getPosts();
}
}
Оба класса регистрируем в корневом модуле - контроллер в списке контроллеров, сервис в провайдерах:
import { Module } from '@nestjs/common';
import { PostController } from './post.controller.js';
import { PostService } from './post.service.js';
@Module({
controllers: [PostController],
providers: [PostService],
})
export class AppModule {}
Сделайте страницу списка работников
в контроллере WorkerController,
которая берёт данные из сервиса
WorkerService, и подключите
оба класса к корневому модулю.