我有一个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
问候!
答案 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,
}),
}),
});