You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:32:10