Как прикрепить фильтр уровня класса с внедрением зависимости? - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь отловить сбои в конкретном контроллере с фильтрами.Мой фильтр требует доступа к другой службе (для сохранения в БД), и я не уверен, как получить фильтр уровня класса с внедрением зависимости (DI, чтобы фильтр имел доступ к службе).

Я имеюв настоящее время передаю сервис от контроллера, где я использую декоратор UseFilters, но понял, что декораторы не используют одну и ту же область видимости.

@UseFilters(new UnprocessableEntityExceptionFilter(myService))
@Catch(UnprocessableEntityException)
export class UnprocessableEntityExceptionFilter implements ExceptionFilter {
  constructor(private readonly requestsService: RequestsService) { }

  async catch(exception: UnprocessableEntityException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();

    const status = exception.getStatus();
    const body = exception.message;

    response.status(status).json(body);
    await this.requestsService.create(request, response, body);
  }
}

И я хочу использовать этот фильтр на уровне классавот так ...

@UseFilters(new UnprocessableEntityExceptionFilter())
export class EventsController {
  constructor() { }

  @Get()
  async get() {
   ...
  }

Но я явно не могу создать новый экземпляр UnprocessableEntityExceptionFilter, потому что он требует внедрения зависимостей.

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

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: HttpExceptionFilter,
    },
  ],
})

1 Ответ

0 голосов
/ 15 мая 2019

Я закончил с этим

@UseFilters(UnprocessableEntityExceptionFilter)
export class EventsController {}
...