微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GraphQL 中的嵌套字段解析器

如何解决GraphQL 中的嵌套字段解析器

目标是使用 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
  }
}

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

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) 有没有办法在 PetResolver 中使用 UserResolver 来利用单个字段解析逻辑?

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

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

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

解决方法

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

... 使解析 pets: [Pet] 属性/关系成为可能 - Pet 列表 ...

...就像https://graphql.org/learn/execution/

中解释的starshipIDs

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

...但当然 pet 可以包含一些 ownerId (仅或显式可见,DB 存储的字段/列)从而可以解析 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 } 对象(部分响应)...服务器将尝试使用 {{1} 解析“缺失”(查询需要)email 属性}(Userowner 类型)类型解析器,将 id 作为参数传递(check/console.log Userparent 解析器参数)。您不必在 args 字段解析器中[相同]“手动”执行此操作。

查询必填字段...

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。