Выбор ответа Senior HTTP-сервер, Express, NestJS обновлено

Request-scoped провайдеры в NestJS

Вопрос

В NestJS сделали логгер @Injectable({ scope: Scope.REQUEST }) и внедрили его в сервис, который используется в десятках контроллеров. Что произойдёт?

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

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Scope всплывает: сервис и его контроллеры тоже станут request-scoped. Scope «пузырится» вверх: если синглтон зависит от request-scoped провайдера, Nest не может создать его один раз, поэтому сервис и всё, что от него зависит, вплоть до контроллеров, становятся request-scoped.

Варианты ответа

  1. Только логгер создаётся на каждый запрос, остальные остаются синглтонами
  2. Scope всплывает: сервис и его контроллеры тоже станут request-scopedправильный ответ
  3. NestJS выдаст ошибку компиляции: синглтон не может зависеть от request
  4. Логгер станет синглтоном, потому что сервис уже синглтон

Разбор

Scope «пузырится» вверх: если синглтон зависит от request-scoped провайдера, Nest не может создать его один раз, поэтому сервис и всё, что от него зависит, вплоть до контроллеров, становятся request-scoped. На каждый запрос пересоздаётся целое дерево объектов, это ощутимо бьёт по производительности.

Контекст запроса (trace id, пользователь) обычно передают через AsyncLocalStorage (в Nest удобно через nestjs-cls) и оставляют провайдеры синглтонами. Ошибки компиляции нет, а логгер не может «стать синглтоном»: Nest уважает заданный scope.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.