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(),
;

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

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

【讨论】:

以上是关于GraphQL:如何实现 GraphQLObjectTypes 的 GraphQLList的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL:如何实现 GraphQLObjectTypes 的 GraphQLList

如何使用 apollo / graphql 实现节点查询解析器

如何在 GraphQL 中使用可选参数实现突变?

如何使用 Graphql SPQR 实现订阅?

如何使用 apollo ios 客户端实现 graphql 订阅

如何使用 GraphQL 联合实现 Relay 节点查询