node.js - 如何使用@ResolveField 在 nestjs/graphql 中创建多级嵌套查询?

标签 node.js graphql nestjs graphql-js

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

我在做什么和上下文:

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

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

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

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

使用@ResolveField 创建二级“ProductHasProvider”

添加 ResolveField(“Providers”)时 - 它出现在主解析器“Product”中并解析 Providers ObjectType。好的,它有效,我可以正确地在第 2 级发出请求。


 @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,但出于某种原因在第一级。即在Apollo studio中,该字段显示在“Product”中。我无法查询 ProductHasProvider 的变体。


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

预期行为:

我添加了一个新的@ResolveField(() => [Variants]) 和“ProductHasProvider”父级(它已经是产品的@ResorveField)。我可以进行第 3 级和第 4 级查询。


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

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

最佳答案

@ResolveField 将被放入一个Resolver 中,指定如何为特定实体返回特定字段。

在您的例子中,您有一个用于ProductsResolver,您在其中为字段Providers< 指定了一个@ResolveField/strong>.

我猜你在同一个 Resolver 中添加了另一个 @ResolveField,它将指定如何返回 Products.

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

这是它对我的工作方式:

@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 });
  }
}

关于node.js - 如何使用@ResolveField 在 nestjs/graphql 中创建多级嵌套查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71938904/

相关文章:

go - 如何动态构建查询过滤器

reactjs - react-apollo getClient 未定义

Javascript不支持64位整数,为什么new Date().getTime()返回41位数字?

typescript - 如何在 nest.js 中创建装饰器?

node.js - Heroku 托管 Microsoft Bot Framework 聊天机器人无法正常工作

javascript - 我的程序只获取数组的第一个值,我需要所有

javascript - 使用下划线搜索数组中的 JSON 值

javascript - NodeJSencodeURI 为 ß 生成错误的结果

NestJS/中间件是否实例化为单例?

nestjs - Nestjs 路由版本控制?