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

Состояние в сервисе NestJS

Вопрос

Что не так с этим сервисом NestJS?

@Injectable()
export class CartService {
  private userId: string;
  setUser(id: string) { this.userId = id; }
  async total() { return this.repo.sumFor(this.userId); }
}

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

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

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

Коротко

Правильный ответ: Провайдер синглтон: запросы перезапишут userId друг другу. По умолчанию провайдер в NestJS создаётся один раз на всё приложение.

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

  1. Ничего, у каждого запроса свой экземпляр сервиса
  2. Провайдер синглтон: запросы перезапишут userId друг другуправильный ответ
  3. В NestJS нельзя объявлять private-поля в провайдерах
  4. @Injectable запрещает async-методы без @Async

Разбор

По умолчанию провайдер в NestJS создаётся один раз на всё приложение. Пока один запрос ждёт await, другой вызовет setUser, и первый посчитает чужую корзину. Данные запроса передают аргументами (или используют request scope, который дороже).

  • Отдельный экземпляр на запрос даёт только Scope.REQUEST, его нужно включать явно.
  • Private-поля и async-методы разрешены.

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

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