GraphQL:如何实现 GraphQLObjectTypes 的 GraphQLList
Posted
技术标签:
【中文标题】GraphQL:如何实现 GraphQLObjectTypes 的 GraphQLList【英文标题】:GraphQL: How to implement a GraphQLList of GraphQLObjectTypes 【发布时间】: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
问候!
【问题讨论】:
【参考方案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(),
;
coworkList
query 定义现在被传递到架构中。
效果很好!
const schema = new GraphQL
Schema(
query: new GraphQLObjectType(
name: 'Query',
fields: () => (
coworkList,
coworkByName,
coworkById,
),
),
);
【讨论】:
以上是关于GraphQL:如何实现 GraphQLObjectTypes 的 GraphQLList的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL:如何实现 GraphQLObjectTypes 的 GraphQLList
如何使用 apollo / graphql 实现节点查询解析器