NestJS中ResolveField内无法将@Args参数传入@InjectLoader的问题
NestJS ResolveField中@InjectLoader无法使用@Args参数的解决方案
问题核心:@InjectLoader装饰器的配置逻辑在类初始化阶段执行,此时方法的@Args参数还未被注入,直接引用input.name会获取到undefined。
解决办法
方法1:手动实例化DataLoader
在ResolveField方法内部动态创建DataLoader实例,直接使用已注入的input参数:
@ResolveField() async resolveTableName( @Parent() parent: ParentTableType, @Args('input') input: PropertyResolveFieldFilter, @InjectEntityManager() entityManager: EntityManager, // 根据你的ORM替换对应的注入实例 ) { const loader = new DataLoader<string, ChildType[]>(async (parentIds) => { // 查询关联数据时直接使用input参数 const children = await entityManager.find(childTableName, { where: { parentId: In(parentIds), name: input.name } }); // 按parentId分组,匹配DataLoader的返回格式 return parentIds.map(id => children.filter(child => child.parentId === id)); }); return loader.load(parent.id); }
方法2:利用库的动态配置能力(如果支持)
若你使用的@InjectLoader封装库允许resolveInput传入函数(接收上下文、方法参数等),可以直接在函数中获取input参数:
@ResolveField() async resolveTableName( @Parent() parent: ParentTableType, @Args('input') input: PropertyResolveFieldFilter, @InjectLoader({ fromEntity: childTableName, resolveType: 'many', fieldName: 'parentId', // 假设库支持函数形式的resolveInput,通过args获取input resolveInput: (_, args) => ({ where: { name: args.input.name } }) }) loader: DataLoader<string, ChildType[]>, ) { return loader.load(parent.id); }
注意:此方法依赖所使用的DataLoader封装库的特性,若库不支持函数式配置,优先使用方法1。
内容的提问来源于stack exchange,提问作者Anto P V
相关产品推荐
相关产品推荐

