如何使用@ResolveField在nestjs/graphql中创建多级嵌套查询



你好。我不知道如何使用@ResolveFiled创建多层嵌套查询。我希望得到你的帮助。🙏

我在做什么和背景:

我有一个产品。该产品有一个供应商。特定于供应商的产品包含产品变体。变体包含选项。

我需要在4个级别提出请求:

  1. 产品
  2. ProductHasProvider
  3. 产品变体
  4. 变体选项

我使用";"代码优先";方法,为每个实体创建了一个ObjectType。接下来,我创建一个";产品";解析器。

创建第二级";ProductHasProvider";带有@ResolveField

当添加ResolveField("Providers")时,它出现在主解析器"内部;产品";并解析Providers ObjectType。好的,它起作用了,我可以正确地在第二级提出请求。


@ResolveField('Providers', () => [ProductHasProvider])
async getProductProviders (@Parent() product: Product) {
const { id } = product;
return await this.productListService.ProductsProviders( { id });
}
  1. 我想制作第三级,其中ProductHasProvider有变体。我将ProductHasProvider装饰为父级
@ResolveField(('variants'), type => [Variant])
async getVariants (@Parent() productHasProvider: ProductHasProvider) {
const { id } = productHasProvider;
return await this.productListService.getVariants({ id });
}

在这种情况下,此ResolveField为[Variants]定义ObjectType,但出于某种原因,它位于第一级。也就是说,在阿波罗工作室,该领域显示在";产品";。我无法查询ProductHasProvider的变体。


query Products {
getProducts {
Providers {
id
}
variants {
id
options {
id
}
}
}
}

预期行为:

我添加了一个新的@ResolveField(()=>[变体])与";ProductHasProvider";父级(已为产品的@ReserveField)。我可以进行三级和四级查询。


query Products {
getProducts {
id
Providers {
id
variants {
id
options {
id
}
}
}
}
}

请告诉我我做错了什么,以及如何实现我想要的。非常感谢。🙏

@ResolveField要放在Resolver中,以指定如何为特定实体返回特定字段。

在您的案例中,您有一个适用于产品Resolver,其中您为字段提供商指定了一个@ResolveField

我猜您正在同一Resolver中添加另一个@ResolveField,它将指定如何返回Products的另一个字段。

您想要的是为Providers创建另一个Resolver,在其中指定如何返回字段变体

以下是它对我的作用:

@Resolver('Product')
export class ProductsResolver {
@ResolveField('Providers', () => [ProductHasProvider])
async getProductProviders (@Parent() product: Product) {
const { id } = product;
return await this.productListService.ProductsProviders( { id });
}
}
@Resolver('Provider')
export class ProvidersResolver {
@ResolveField('variants', () => [Variant])
async getProductProviders (@Parent() provider: ProductHasProvider) {
const { id } = provider;
return await this.variantsService.getVariantForProvider( { id });
}
}

最新更新