如何在 NestJS 拦截器中获取存储库
How to get repository in NestJS Interceptor
我在模块中创建了拦截器。我想在拦截器中获取存储库 [LocumRepository] 并在调用后进行一些处理。
以下是我的拦截器 class:
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 在模块文件中声明,但我在拦截器之外使用它 class
由于 interceptor
是 @Injectable()
,您可以采用 DI 方法并像往常一样使用 @InjectRepository(Locum)
(或任何您的实体名称)注入它,然后执行常规服务 this.repo.repoMethod()
。这样,您仍然可以获得使用 DI 的好处,并且能够在测试期间提供 amock。使用此方法唯一要确保的是,您在将使用拦截器的当前模块中拥有此存储库。
我在模块中创建了拦截器。我想在拦截器中获取存储库 [LocumRepository] 并在调用后进行一些处理。 以下是我的拦截器 class:
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 在模块文件中声明,但我在拦截器之外使用它 class
由于 interceptor
是 @Injectable()
,您可以采用 DI 方法并像往常一样使用 @InjectRepository(Locum)
(或任何您的实体名称)注入它,然后执行常规服务 this.repo.repoMethod()
。这样,您仍然可以获得使用 DI 的好处,并且能够在测试期间提供 amock。使用此方法唯一要确保的是,您在将使用拦截器的当前模块中拥有此存储库。