graphql - NestJS GraphQL 联合循环解析器

标签 graphql nestjs apollo resolver

我正在开发现有的 GraphQL 服务,我已使用 apollo 联合成功将其分解为更小的服务。我有一些类型被其他服务扩展,一切都工作正常。然而,正如我遵循这个例子:https://docs.nestjs.com/graphql/federation现在我遇到了循环引用之类的问题。

所以基本上我有两种类型:

@ObjectType()
@Directive('@key(fields: "id")')
export class Original {
    @Field(type => ID)
    id: string;

    ...
}

// extending it in the other service
@ObjectType()
@Directive('@extends')
@Directive('@key(fields: "id")')
export class Original {
    @Field(type => ID)
    @Directive('@external')
    id: string;

    @Field(type => [Other])
    @Directive('@requires(fields: "id")')
    others: Other[];

    ...
}

@ObjectType()
@Directive('@key(fields: "id")')
export class Other {
    @Field(type => ID)
    id: string;
    
    ...

    @Field(type => Original, { nullable: true })
    original?: Original;
}

我有两个解析器,都在扩展原始类型的服务中:

@Resolver(of => Original)
export class OriginalResolver {
  ...

  @ResolveField(returns => [Other])
  async others(@Parent() original: Original) {
      const { id} = original;
      ...
  }
}

@Resolver(of => Other)
export class OtherResolver {
  ...
  @ResolveField((of) => Original)
  async original(@Parent() other: Other) {
    return { __typename: 'Orignal', id: other.original.id };
  }
}

正如解析器所建议的,我可以进行如下查询:

...,
original{
  others{
    original{
      *and so on...*
    }
  }
}

我不希望这个循环查询成为可能,我正在尝试删除它,但到目前为止我还没有运气。如果我只是删除“原始”字段解析器(它应该返回 __typename),apollo 将不再扩展原始类型。我猜想这条线基本上连接了两个服务以找到原始类型,但到目前为止我对 apollo 的了解还不是很深......

所以我的问题是如何一起删除该解析器,或者如果 Apollo 必须在那里工作,有什么方法可以“隐藏它”吗?

提前致谢,欢迎随时询问您可能需要的任何更多信息。

最佳答案

在 GraphQL 中使用“循环”是完全合法的(注意“图表”)。 GraphQL“按设计”提供了自由塑造查询[和响应结构]的能力,包括“循环”创建。

我不会说这是“循环引用类型的问题”。这可能是一个效率/性能问题...... **这不是一个邪恶......当不被滥用时

您可以使用一些指标来限制 API 使用、限制“最大解析深度级别”/等。

在这种情况下,当parentothers时,您可以简单地在original解析器中返回null 类型。这样original只能在查询顶级/根级别上查询。

关于graphql - NestJS GraphQL 联合循环解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66596908/

相关文章:

c# - Dotnet 使用 graphQL 客户端,数据响应未映射

javascript - SWR 不从 fetcher 填充数据,卡在加载中

javascript - 为什么nestjs无法解决依赖关系?

dependency-injection - nestjs 全局 pubsub 实例和依赖注入(inject)

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

graphql - 突变的 Apollo react 未定义

reactjs - 撰写未从 react-apollo 导出

angular - Apollo - Angular : Error: Uncaught (in promise): Error: Client has not been defined yet

reactjs - 增加超时限制 gatsby-source-wordpress-experimental

reactjs - 如何用Apollo Graphql Client和React解决 'TypeError: Cannot read property ' params' of undefined'?