Как использовать новый экземпляр для каждого нового HTTP-запроса в NestJS? - PullRequest
1 голос
/ 08 марта 2019

У меня есть API, и я пытался отправить запрос. Это работает, но я заметил, что классы не были уничтожены после того, как я получил ответ. Сейчас я работаю с nestJS, но у nodeJS + expressJS также была эта проблема, когда я пытался протестировать.

Я использую следующий код:

@Injectable()
export class UsersService {
    s = '';

    constructor() {}

    async findAll(): Promise<any> {
        this.s += ' haha ';
        return await this.s;
    }
}

Возвращается haha в первый раз haha haha во второй раз и т. Д.

Я не совсем уверен, является ли это желаемым поведением или, возможно, не настроен должным образом, потому что сейчас я только изучаю nestJS. Ранее я работал с Zend Framework, который не демонстрировал такого поведения.

Любое руководство будет высоко ценится.

Спасибо.

1 Ответ

2 голосов
/ 08 марта 2019

С выпуском nest.js 6.0 были добавлены области инъекций . При этом вы можете выбрать одну из следующих трех областей для своих провайдеров:

  • SINGLETON : поведение по умолчанию. Один экземпляр вашего провайдера используется для всего приложения
  • TRANSIENT : выделенный экземпляр вашего провайдера создается для каждого провайдера, который его внедряет.
  • ЗАПРОС : Для каждого запроса создается новый поставщик. Внимание: это поведение будет всплывать в вашей цепочке зависимостей. Пример: если UsersController (Singleton) внедряет UsersService (Singleton), который внедряет OtherService (Запрос), то и UsersController, и UsersService автоматически становятся областью запроса.

Использование

Либо добавьте его в @Injectable() декоратор:

@Injectable({ scope: Scope.REQUEST })
export class UsersService {}

Или установите его для пользовательских провайдеров в определении вашего модуля:

{
  provide: 'CACHE_MANAGER',
  useClass: CacheManager,
  scope: Scope.TRANSIENT,
}

То, что вы ищете, это провайдеры в области запроса. Они не поддерживаются в nest v5, см. эту проблему . На данный момент все провайдеры являются синглетонами.

Они были добавлены с этим запросом на получение , хотя и будут частью гнезда v6. В новой версии мы получим временные и индивидуальные области.

...