gpt4 book ai didi

node.js - InjectRepository 如何在 NestJS 内部工作?

转载 作者:行者123 更新时间:2023-12-03 12:18:16 25 4
gpt4 key购买 nike

在nestjs中,我明白

imports: [
TypeOrmModule.forFeature([TaskRepository]),
],
创建某种提供者 token ,以便我可以使用此 token 将存储库注入(inject)我的服务(在同一模块中)。
我不明白的是 @InjectRepository()在内部工作,例如:
constructor(
@InjectRepository(TaskRepository)
private taskRepository: TaskRepository,
) {}
InjectRepository怎么样自定义装饰器(应该使用 createParamDecorator 创建)能够注入(inject)在模块中注册的提供程序?我研究发现 createParamDecorator没有能力使用DI。如果 createParamDecorator只是创建一个新的 TaskRepository实例并返回,那我为什么要导入 TypeOrmModule.forFeature在模块中?有人可以解释这是如何在内部工作的吗?谢谢!

最佳答案

你在正确的轨道上,但是 @InjectRespoitory()createParamDecorator()通常是两种不同的装饰器类型。是的,它们都适用于参数,但它们通常有不同的用例。createParamDecorator适用于 Controller 、解析器和网关路由处理程序,以便 Nest 可以知道 req 的哪一部分, context , 或 payload对象(或您想要获取的 ExecutionContext 的任何其他部分)应放入路由处理程序的参数位置。其背后的代码有点复杂,但如果你真的很好奇,我可以指出它。@InjectRepository()另一方面是 @Inject() 的扩展。它采用当前传递的实体/存储库并使用一些逻辑来创建新的注入(inject) token 。一般这个逻辑是<EntityName>Repository有时使用 connection添加到它。此 token 与 TypeormModule.forFeature() 中创建的 token 匹配对于同一个实体。 (旁注:如果传递的实体是存储库,则 token 只是 <EntityName> 如果不是默认连接,则带有可选连接)。
你可以试试这个但摆脱@InjectRepository()而是使用 @Inject()仅出于测试目的,但我不建议在生产服务器实例中这样做。出错的机会太多了。
这里需要注意的真正重要的事情是 @InjectRepository()实际上并没有注入(inject)任何东西。它只是为 Nest 设置元数据以读取并匹配自定义提供程序。 TypeormModule.forFeature()实际上是在这里做繁重的工作,创建具有匹配注入(inject) token 的自定义提供程序并为提供程序提供正确的值。
顺便说一句,@InjectRepository()TypeormModule.forFeature()必须一起工作,因为 Typescript 不能正确反射(reflect)泛型。通常对于 Nest,我们可以使用类名作为注入(inject)标记,但类似于 Repository<TaskEntity>Repository 的形式返回所以 Nest 不知道要注入(inject)哪个存储库。通过使用 @InjectRepository()装饰器我们能够设置注入(inject) token 元数据并覆盖反射的类值。

关于node.js - InjectRepository 如何在 NestJS 内部工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65938257/

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