Request-scoped провайдеры в NestJS
Вопрос
В NestJS сделали логгер @Injectable({ scope: Scope.REQUEST }) и внедрили его в сервис, который используется в десятках контроллеров. Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Только логгер создаётся на каждый запрос, остальные остаются синглтонами
- Scope всплывает: сервис и его контроллеры тоже станут request-scopedправильный ответ
- NestJS выдаст ошибку компиляции: синглтон не может зависеть от request
- Логгер станет синглтоном, потому что сервис уже синглтон
Разбор
Scope «пузырится» вверх: если синглтон зависит от request-scoped провайдера, Nest не может создать его один раз, поэтому сервис и всё, что от него зависит, вплоть до контроллеров, становятся request-scoped. На каждый запрос пересоздаётся целое дерево объектов, это ощутимо бьёт по производительности.
Контекст запроса (trace id, пользователь) обычно передают через AsyncLocalStorage (в Nest удобно через nestjs-cls) и оставляют провайдеры синглтонами. Ошибки компиляции нет, а логгер не может «стать синглтоном»: Nest уважает заданный scope.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.