1

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

我有一个getItemByName正确返回Item, 和 Type的查询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

问候!

4

3 回答 3

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 - 都是列表),您应该定义一个单独的类型。请记住相应地修改解析函数:

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

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

于 2016-07-30T06:53:26.433 回答
1

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

于 2016-07-29T21:14:59.463 回答
0

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

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

查询定义现在coworkList被传递到模式中。效果很好!const schema = 新的 GraphQL

Schema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: () => ({
      coworkList,
      coworkByName,
      coworkById,
    }),
  }),
});
于 2016-07-30T06:23:54.800 回答