Как внедрить провайдера в области запросов на контроллере Nest JS? - PullRequest
2 голосов
/ 10 января 2020

У меня есть область запроса, добавляемая для ведения журнала.

fe

import { Injectable, Scope } from '@nestjs/common';

@Injectable({ scope: Scope.REQUEST })
export class RequestLogger {
  public log(message: string) {
    console.log(message);
  }
}

(не обращайте внимания на то, что он еще не использует конструктор с запросом; это не имеет значения )

И у меня также есть контроллер с несколькими одноэлементными инъекциями.

Я бы хотел ввести запрос, вводимый таким образом, чтобы контроллер мог быть инициирован только один раз. Внедрение его в конструктор заставит контроллер пересоздавать при каждом запросе, так что, конечно, это не так (не так ли?).

Я пытался поместить его в сигнатуру метода, но, похоже, это не так сделайте что-нибудь.

например,

@Controller('register')
export class RegisterApiController {
  public constructor(
    private readonly registerService: RegisterService,
  ) {
    console.log('Controller initiated');
  }

  @Post()
  public async postIndex(
    @Inject(RequestLogger) logger: RequestLogger,
  ): Promise<unknown> {
    console.log('request made');
    logger.log('Logger message to log');

    return this.registerService.register();
  }
}

после приложения bootstrap (которое также включает «Контроллер инициирован»), каждый запрос завершается с ошибкой 500 и в консоли

Request made
[TypeError] Cannot read property 'log' of undefined

Есть ли способ внедрить вводимый объем запроса без принудительного воссоздания контроллера, который его использует? Что это?

Если нет другого пути, есть ли хотя бы способ переместить начальные логики контроллера c куда-нибудь еще, чтобы можно было сделать то, что нужно сделать один раз при первом запуске контроллера init есть

1 Ответ

1 голос
/ 10 января 2020

С гнездом js, к сожалению, это невозможно, см. документы :

Область действия пузыря впрыскивает цепь. Контроллер, зависящий от поставщика, находящегося в области запросов, сам по себе будет охватывать запросы.


Однако вы можете ввести логический исходный контроллер c в контроллер как одиночный, так что он не будет выполняться снова для каждого запроса.

...