gpt4 book ai didi

node.js - 在自定义拦截器中访问 Nest "injector"

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:27 25 4
gpt4 key购买 nike

我需要在 intercept 函数中访问一个服务(由 Nest TypeOrmModule 提供)(重要提示:不是 constructor 参数!! !) 因为它取决于传递的选项(在本例中为实体)。

服务注入(inject) token 由 getRepositoryToken 函数提供。

export class PaginationInterceptor {
constructor(private readonly entity: Function) {}

intercept(context: ExecutionContext, call$: Observable<any>): Observable<any> {
// Here I want to inject the TypeORM repository.
// I know how to get the injection token, but not HOW to
// get the "injector" itself.
const repository = getRepositoryToken(this.entity);

// stuff...

return call$;
}
}

Nest 有“服务容器”的概念吗?这github issue没有帮助我。

示例用法( Controller 操作):

  @Get()
@UseInterceptors(new PaginationInterceptor(Customer))
async getAll() {
// stuff...
}

最佳答案

关于依赖注入(inject)(如果您真的想要/需要它),我想使用mixin 类可以解决问题。查看v4 documentation (高级 > Mixin 类)。

import { NestInterceptor, ExecutionContext, mixin, Inject } from '@nestjs/common';
import { getRepositoryToken } from '@nestjs/typeorm';
import { Observable } from 'rxjs';
import { Repository } from 'typeorm';

export function mixinPaginationInterceptor<T extends new (...args: any[]) => any>(entityClass: T) {
// declare the class here as we can't give it "as-is" to `mixin` because of the decorator in its constructor
class PaginationInterceptor implements NestInterceptor {
constructor(@Inject(getRepositoryToken(entityClass)) private readonly repository: Repository<T>) {}

intercept(context: ExecutionContext, $call: Observable<any>) {
// do your things with `this.repository`
return $call;
}
}

return mixin(PaginationInterceptor);
}

免责声明:这是有效的 TypeScript 代码,但我没有机会在真实项目中对其进行测试,因此它可能需要一些返工。这个想法是像这样使用它:

@UseInterceptors(mixinPaginationInterceptor(YourEntityClass))

如果您对代码有任何疑问,请告诉我。但我认为关于 mixin 的文档非常好!


OR 您还可以使用 typeorm 中的 getRepository(传递实体类)。 这不是 DI,因此,它将迫使您spyOn getRepository 函数以进行适当的测试。


关于容器,我几乎可以肯定访问它的唯一方法是使用 Execution Context ,正如 Kim 所指出的。

关于node.js - 在自定义拦截器中访问 Nest "injector",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51734051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com