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只是不再扩展原始类型。我想这条线基本上是连接两个服务以找到原始类型的,但到目前为止我还没有深入到apollo。。。

所以我的问题是,我该如何将解析器全部移除,或者如果apollo必须这样才能工作,有没有办法";把它藏起来"?

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

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

我不会说这是"循环参考类问题"。这可能是一个效率/性能问题**这不是邪恶未被滥用时

您可以使用某些指标来限制API的使用,限制"最大解析深度级别">/等。

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

最新更新