Как получить репозиторий в NestJS Interceptor

Я создал на Interceptor в модуле. Я хочу получить репозиторий [LocumRepository] в Interceptor и обработать его после вызова. Ниже приведен мой класс Intercepter:

import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { LocumEntity } from '../../locum/entities/locum.entity';
import { getRepository, Like, Repository } from 'typeorm';
import { Observable, combineLatest } from 'rxjs';
import { tap } from 'rxjs/operators';
import { map } from 'rxjs/operators';


@Injectable()
export class ApprovalInterceptor implements NestInterceptor {


  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next
      .handle()
      .pipe(
        map(value => this.updateLocumStatus(value, context))
      );
  }

  async updateLocumStatus(value, context) {
    if (context.switchToHttp().getResponse().statusCode) {
      
      let locumData = await getRepository(LocumEntity)
        .createQueryBuilder('locum')
        .where('locum.id = :id', { id: value.locumId })
        .getOne();

    }
    return value;
  }
}

Я получаю следующую ошибку:

Репозиторий для LocumRepository не найден. Похоже, этот объект не зарегистрирован в текущем соединении "по умолчанию"?

в то время как LocumRepository объявлен в файле модуля, и я использую его вне класса Interceptor

1 ответ

Решение

Как interceptor является @Injectable() вы можете использовать подход DI и ввести его, как обычно, используя @InjectRepository(Locum) (или как там называется ваша сущность), а затем выполните обычное обслуживание this.repo.repoMethod(). Таким образом, вы по-прежнему получаете преимущества от использования DI и возможности предоставления фиксации во время тестирования. Единственное, в чем нужно убедиться при таком подходе, - это то, что у вас есть этот репозиторий, доступный в текущем модуле, где будет использоваться перехватчик.

Другие вопросы по тегам