首页 > 解决方案 > 如何在 NestJS 拦截器中获取存储库

问题描述

我在模块中的拦截器上创建了。我想在拦截器中获取存储库 [ LocumRepository ] ​​并在调用后进行一些处理。以下是我的拦截器类:

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 类之外使用它

标签: nestjsnestjs-gateways

解决方案


照原样interceptor@Injectable()您可以采用 DI 方法并按照您通常使用的方式@InjectRepository(Locum)(或您的实体名称)注入它,然后执行通常的 service this.repo.repoMethod()。这样,您仍然可以获得使用 DI 并能够在测试期间提供模拟的好处。使用这种方法唯一要确保的是,您在将使用拦截器的当前模块中拥有此存储库。


推荐阅读