【问题标题】:GraphQL: How to implement a GraphQLList of GraphQLObjectTypesGraphQL:如何实现 GraphQLObjectTypes 的 GraphQLList
【发布时间】:2016-12-04 15:22:00
【问题描述】:

我对 GraphQL 有疑问(特别是实现 GraphQLList)

我有一个查询getItemByName,它正确返回了Item,类型为itemType。但我无法实现getItemList(或者一个适当的例子)。我知道它应该有一个实现 GraphQLList 的类型。

但我做得对吗? resolve 应该接收的数据格式是什么? (或者 getItems() 应该返回)。对象数组?这些对象是否应该实现“itemType”定义?是否应该实现接口?

export const itemType = new GraphQLObjectType({
  name: 'Item',
  fields: {
    name: {
      type: GraphQLString,
      description: 'Item Name',
    },
  },
});

const itemListType = new GraphQLObjectType({
  name: 'ItemsList',
  fields: {
    items: {
      type: new GraphQLList(itemType),
      description: 'List of items',
    },
  },
});

{...}

const schema = new GraphQLSchema({
    query: new GraphQLObjectType({
        name: 'Query',
        fields: {
           itemList: {
               type: itemListType,
               resolve: () => getItems(),
           }
        }
    })
})

现在,查询:

itemList {
  items {
    name
  }
}

它的回归:

{
  "data": {
    "itemList": {
      "items": null
    }
  }
}

真的非常欢迎任何帮助! :D

问候!

【问题讨论】:

    标签: graphql relay graphql-js


    【解决方案1】:

    我将首先解释您的问题的根本原因。然后我会讨论GraphQLList的一般使用方式。

    在您的架构查询中,itemList 字段的类型为 itemListType。现在这个itemListType 有一个字段items。因此,查询的itemList 字段必须解析为具有items 字段的对象。但是getItems() 函数返回一个数组或一个承诺的数组,并且没有字段items。这就是您在查询响应中收到 "items": null 的原因。

    现在关于 GraphQLList 的混淆:如果它只是一个列表,实际上没有必要为此定义一个单独的 GraphQL 类型。在您的查询中,您包含一个项目类型为 GraphQLList 的字段:

    const schema = new GraphQLSchema({
        query: new GraphQLObjectType({
            name: 'Query',
            fields: {
               itemList: {
                   type: new GraphQLList(itemType),
                   resolve: () => getItems(),
               }
            }
        })
    });
    

    如果您的列表不是那么简单,例如,itemList 实际上有两个字段(oldItems、newItems - 都是列表),您应该定义一个单独的类型。记得相应地修改 resolve 函数:

    itemList: {
      type: itemListType,
      resolve: () => {
        // get new items
        // get old items
        return {
          newItems, 
          oldItems
        };
      },
    },
    

    (顺便说一句,您的代码有一些语法错误,例如 itemsList、itemList、itemsListType、itemListType。我已经编辑了您的问题。更改将在我的编辑被批准后出现。)

    【讨论】:

      【解决方案2】:

      getItems() 应该返回一个 itemType 对象的数组(或者一个承诺)。这些 itemType 的外观取决于您。它们将被简单地传递给您在itemType 中请求的字段的resolve 函数。

      【讨论】:

      • 其实是一个承诺。但是当你说 itemType 的数组时。我需要以某种方式改造它们吗?或仅使用具有name 属性的对象数组,即[{name: 'asd'}]
      • 数组中的对象可以是任何你想要的,所以{name: 'asd'} 完全没问题。
      【解决方案3】:

      解决了这个问题。 这不是我返回的数据结构的问题,而是我定义查询的方式。

      export const coworkList = {
        name: 'coworkList',
        description: 'Returns a list (up until 10) of coworks',
        type:  new GraphQLList(coworkType),
        resolve: () => getCoworks(),
      };
      

      coworkListquery 定义现在被传递到架构中。 效果很好! const schema = new GraphQL

      Schema({
        query: new GraphQLObjectType({
          name: 'Query',
          fields: () => ({
            coworkList,
            coworkByName,
            coworkById,
          }),
        }),
      });
      

      【讨论】:

        猜你喜欢
        • 2020-05-27
        • 2017-11-18
        • 2018-12-09
        • 2021-09-19
        • 1970-01-01
        • 2021-06-25
        • 2019-11-25
        • 2018-12-09
        • 2020-03-21
        相关资源
        最近更新 更多