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

NestJS GraphQL 联邦循环解析器

如何解决NestJS GraphQL 联邦循环解析器

我正在开发一个现有的 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 将不再扩展原始类型。我想这条线基本上是连接两个服务以找到原始类型的东西,但到目前为止我对阿波罗的了解还没有那么深...

所以我的问题是我怎么能一起删除那个解析器,或者如果它必须在那里让阿波罗工作,有没有办法“隐藏它”?

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

解决方法

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

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

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

在这种情况下,当 return nulloriginal 类型时,您可以在 parent 解析器中简单地 others。这样 original 只能在查询顶级/根级别进行查询。

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