Как передать экземпляр службы REQUEST в глобальный перехватчик - PullRequest
0 голосов
/ 20 февраля 2020

Я использую Nest JS в Backend. У меня есть служба ведения журнала scoped.Request

@Injectable({ scope: Scope.REQUEST })
export class LoggingService extends BaseLoggerService implements LoggerService {
  constructor(readonly configService: ConfigurationService, @Inject(RequestContextService) readonly requestContextService: IRequestContextService) {}

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

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
    constructor(@Inject(LoggingService) private readonly logger: LoggingService) {
    }  }

Теперь в app.ts я пытаюсь определить useGlobalInterceptors в обход экземпляр Logging service. Тем не менее, он выдает ошибку на npm run start.

app.useGlobalInterceptors(new LoggingInterceptor(app.get(LoggingService)));

Ошибка

2020-02-20T10:51:54.409Z ERROR [object Object] (RID:NOT_SET RP:NOT_SET TK:) (AN:NOT_SET COM:NOT_SET UAN:NOT_SET) LoggingService is marked as a scoped provider. Request and transient-scoped providers can't be used in combination with "get()" method. Please, use "resolve()" instead. Error: LoggingService is marked as a scoped provider. Request and transient-scoped providers can't be used in combination with "get()" method. Please, use "resolve()" instead.

1 Ответ

0 голосов
/ 20 февраля 2020

Поскольку в сообщении об ошибке указывается, что LoggerService имеет область действия REQUEST, вам необходимо использовать await app.resolve<LoggingService>(LoggingService), однако вместо этого вам, вероятно, захочется связать перехватчик глобально и позволить Nest позаботиться о внедрение зависимости путем добавления перехватчика в массив providers следующим образом:

@Module({
  imports: [...],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: LoggingInterceptor
    },
    ...
  ]
})
export class AppModule {}

Следует иметь в виду, что перехватчику уже доступен весь контекст запроса. Кроме того, я не уверен, как функционируют энхансеры, если они становятся областью действия REQUEST (что произойдет, если у нее есть зависимость от области REQUEST), поэтому имейте в виду, что это может быть не лучшим путем вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...