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