РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsSpScRS 10 of 201 menu
◀ ▶

Один экземпляр на запрос в 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, подключив оба типа к корневому модулю.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить