【问题标题】:How can I pass an array of objects into Query?如何将对象数组传递给 Query?
【发布时间】:2019-12-13 02:01:13
【问题描述】:

我正在尝试弄清楚如何将对象数组传递到我的 GraphQL 查询中,但是我发现文档对如何执行此操作有点不清楚。我在 FE 中使用 Apollo,在 BE 中使用 Graphql-yoga,并使用 Prisma 作为我的数据库及其 API。

这是我对硬编码对象数组的查询:

const USERS = gql`

  query USERS(
    $userId: ID
  ) {
    users(
      where: {
        id_not: $userId
        hasProducts_some: {
          OR: [
            { itemId: 1 },
            { itemId: 2 }
          ]
        }
      }
    ) {
      firstName
    }
  }
`;

上面的查询返回了我想要的,我有点卡住的是如何获取这个数组:

[
  { itemId: 1 },
  { itemId: 2 }
]

作为查询的变量传入。从我在网上可以找到的内容来看,我可能需要在客户端创建一个GraphQLObjectType 才能传入对象定义。这是我的实现:

import { GraphQLObjectType, GraphQLString } from 'graphql';

const ProductName = new GraphQLObjectType({
  name: 'ProductName',
  fields: () => ({
    itemId: {
      type: GraphQLString,
    },
  })
});

const USERS = gql`

  query USERS(
    $userId: ID,
    $hasProducts: [ProductName]
  ) {
    users(
      where: {
        id_not: $userId
        hasProducts_some: {
          OR: $hasProducts
        }
      }
    ) {
      firstName
    }
  }
`;

以上返回我以下错误:

未知类型“产品名称”

我是否采用了正确的方法来传递对象数组,如果是这样,我的实现有什么问题?

【问题讨论】:

    标签: javascript reactjs graphql apollo


    【解决方案1】:

    在创建服务器端模式时创建并使用类型。一旦创建,模式就不能在运行时修改——它具有创建时指定的任何类型和指令。换句话说,在客户端定义一个 new 类型是没有意义的——它不能用于你发送到服务器的任何查询,因为服务器不知道类型。 p>

    如果将变量(如$hasProducts)传递给参数(如hasProducts_some),则该变量的类型必须与参数的类型匹配。这种类型可以是标量(如StringInt),也可以是输入对象类型。那是什么确切类型取决于架构本身。要确定要使用的类型,您可以在 GraphQL Playground(或 GraphiQL)中打开架构的文档并搜索相关字段(在本例中为 hasProducts_some)。

    请注意,您也可以只为整个 where 字段传递一个变量。

    【讨论】:

      【解决方案2】:

      graphql 的新手。但想知道这是否可以解决它。

      const USERS = gql`
       query USERS(
          $userId: ID,
          $hasProducts: GraphQLList(ProductName) 
        ) {
          users(
            where: {
              id_not: $userId
              hasProducts_some: {
                OR: $hasProducts
              }
            }
          ) {
            firstName
          }
        }
      `;
      

      微小的变化,但我无权发表评论。所以发布它作为答案。

      【讨论】:

      • 我怕不高兴
      • 是的,您应该发布一堆错误发生的确切位置。
      【解决方案3】:

      由于 gql 函数需要一个模板字面量,你应该像这样转义产品对象:

      const USERS = gql`
      
        query USERS(
          $userId: ID,
          $hasProducts: [${ProductName}]
        ) {
          users(
            where: {
              id_not: $userId
              hasProducts_some: {
                OR: $hasProducts
              }
            }
          ) {
            firstName
          }
        }
      `;
      

      【讨论】:

      • 不确定是否需要那些文字数组括号,我认为这取决于 qgl 正在评估的内容。但是玩弄那些括号,否则看起来很好。
      • 嗯,这给了我以下错误:传播不可迭代实例的无效尝试
      • 啊,我的错。假设它正在返回一个数组。只需省略 ... 扩展运算符。以上更新。
      • Spread opertaor 删除了消息,但我仍然收到错误 Unknown type "ProductName"
      猜你喜欢
      • 2016-06-06
      • 2021-11-26
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2019-12-19
      • 2017-07-21
      相关资源
      最近更新 更多