GraphQL:如何实现GraphQLObjectTypes的GraphQLList

时间:2016-07-29 20:11:30

标签: graphql relay graphql-js

我有一个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

问候!

3 个答案:

答案 0 :(得分:1)

getItems()应返回一个itemType对象数组(或一个promise的对象)。这些itemTypes的外观取决于您。它们只会被传递到您在resolve中要求的字段的itemType函数。

答案 1 :(得分: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 :(得分:0)

修正了问题。 我返回的数据结构不是问题,而是我定义查询的方式。

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

coworkList查询定义现在正在传递到架构中。 效果很好! const schema = new GraphQL

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