【问题标题】:Nested field resolvers in GraphQLGraphQL 中的嵌套字段解析器
【发布时间】:2021-07-28 21:00:05
【问题描述】:

目标是使用 NestJS 以代码优先的方式实现 GraphQL 架构。

假设我的 GraphQL 架构中有一个 Pet 类型,其中包含两个字段 nameage。如果这两条信息来自不同的事实来源(而且我并不总是想同时获取两者),我可以为每个字段实现一个带有解析器的 PetResolver 类:

@Resolver(() => Pet)
export class PetResolver {
  @Query(() => Pet)
  pet(): Pet {
    return {};
  }

  @ResolveField()
  name(): Promise<string> {
    return Promise.resolve('Spot');
  }

  @ResolveField(() => Int)
  age(): Promise<number> {
    return Promise.resolve(2);
  }
}

可以这样使用:

query GetPet {
  pet {
    name
  }
}

这样可以确保每个字段的值仅在请求时才被获取,但是如果我想在我的 User 类型上拥有一个 pet 字段,我可以像这样查询:

query GetUserWithPet {
  currentUser {
    email
    pet {
      name
    }
  }
}

应用同样的原理,我可以像这样创建一个 UserResolver 类:

@Resolver(() => User)
export class UserResolver {
  @Query(() => User)
  @UseGuards(AuthCognitoGuard)
  currentUser(@CurrentUser() user: IdTokenPayload): User {
    return {
      id: user.sub,
      email: user.email,
    };
  }

  @ResolveField()
  pet(@Parent() user: User): Promise<Pet> {
    return petService.getPetForUserId(user.id);
  }
}

但是PetService 实现如果只想获取相关数据,则必须知道请求了哪些字段。

A) 有没有办法在 UserResolver 中使用 PetResolver 来利用单个字段解析逻辑?

B) 如果不是,那么使用 NestJS 代码优先约定确定查询中请求哪些字段的最佳方法是什么?

C) 这是思考 GraphQL 查询的“错误”方式吗?最佳实践是否要求我保留单独的解析器并使用如下查询:

query GetUserWithPet {
  currentUser {
    email
  }
  pet {
    name
  }
}

【问题讨论】:

    标签: graphql nestjs code-first


    【解决方案1】:

    用户应该包含一些petIds [array] 值(内部,数据库存储字段/列)...

    ... 可以解决 pets: [Pet] prop/relation - Pet 列表 ...

    ...就像starshipIDshttps://graphql.org/learn/execution/ 中解释的一样

    注意:宠物服务被询问关于使用宠物ID的记录。

    ...当然,宠物可以包含一些ownerId(仅或明确可见,数据库存储的字段/列),从而可以解决owner: User prop [reverse] 关系-这样您可以:

    query PetWithOwner {
      pet (id: "someID") {
        id
        name
        owner {
          id
          email
          # more pets?
          pets {
            id
            name
            # you can loop it ;)
            owner {
              id
              email
    

    pet.owner 字段解析器只能返回 { id: ownerId } 对象(部分响应)...服务器将尝试使用 User 解析“缺失”(查询需要)email 道具(owner 是 @987654334 @type) 类型解析器,将 id 作为 arg 传递(check/console.log parentargs 解析器 args)。您不必在 pet.owner 字段解析器中“手动”执行此操作。

    查询必填字段...

    ... [选择集] 可以从 info 对象读取 - 第 4 个解析器参数 - 阅读文档/教程了解详细信息

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 2018-08-25
      • 1970-01-01
      • 2019-10-14
      • 2020-10-07
      • 1970-01-01
      • 2019-05-17
      • 2021-07-26
      • 2020-08-26
      相关资源
      最近更新 更多