Область видимости контроллера в Nest
Синглтон контроллера тоже хранит поля между запросами. Если счётчик или буфер лежит прямо в контроллере, клиенты снова делят одно состояние.
Область можно указать в настройках
@Controller: тогда Nest
создаёт новый экземпляр контроллера
на каждый запрос, так же как для
сервиса с областью запроса.
Путь адреса задают полем path,
область - полем scope с тем
же перечислением Scope.
Сервис при этом может оставаться
синглтоном.
Покажем на примере постов. Контроллер будет вести счётчик:
import { Controller, Get, Scope } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller({ path: 'posts', scope: Scope.REQUEST })
export class PostController {
hits = 0;
postService: PostService;
constructor(postService: PostService) {
this.postService = postService;
}
@Get()
getPosts(): string {
this.hits += 1;
return `${this.hits}:${this.postService.getLabel()}`;
}
}
Сервис вернёт метку времени создания, чтобы видеть отдельный объект сервиса на запрос:
import { Injectable, Scope } from '@nestjs/common';
@Injectable({ scope: Scope.REQUEST })
export class PostService {
born = Date.now();
getLabel(): string {
return String(this.born);
}
}
Оба типа регистрируем в корневом модуле:
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,
подключив оба типа к корневому
модулю.