NestJS GraphQL联合循环解析器

NestJS GraphQL联合循环解析器,graphql,nestjs,apollo,resolver,Graphql,Nestjs,Apollo,Resolver,我正在开发一个现有的GraphQL服务,我已经使用apollo federation成功地将其分解为更小的服务。我有一些类型被其他服务扩展,一切正常。然而,当我遵循这个例子时:现在我有一个循环引用类的问题 所以基本上我有两种类型,例如: @ObjectType() @Directive('@key(fields: "id")') export class Original { @Field(type => ID) id: string; ...

我正在开发一个现有的GraphQL服务,我已经使用apollo 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...*
    }
  }
}
我不希望这个循环查询成为可能,我正在尝试删除它,但到目前为止我没有运气。如果我简单地删除“原始”字段解析器,它将返回_类型名,apollo将不再扩展原始类型。我猜这条线路基本上是连接两个服务的,以找到原始类型,但我还没有深入阿波罗到目前为止

所以我的问题是,我怎样才能把分解器全部移除,或者,如果阿波罗必须在那里才能工作,有没有办法“隐藏它”


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

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

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

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


在这种情况下,当
父级
其他
类型时,您可以在
原始
解析程序中简单地
返回null
。这样,只能在查询顶部/根级别查询原始的

是的,我知道关键是能够自由地创建查询,我只是不想让用户滥用此功能:)。但是谢谢你的建议,我认为按照你的建议返回空值对我们来说很好。