繁体   English   中英

使用Relay和GraphQL进行查询

[英]Query with Relay and GraphQL

我正在学习React + Relay + GraphQL教程@ https://facebook.github.io/relay/docs/tutorial.html

我对于什么接口感到困惑:[nodeInterface]在GraphQL对象定义中做了什么。

简答

当客户端(通常是浏览器)请求从初始提取已经拥有的一段GraphQL数据时, nodeInterface仅由GraphQL使用,以便重新获取。

在以下任何情况下都会执行重新获取:

  • 不同/相同的React组件(在同一网页上)在稍后阶段请求额外的数据,并且这些数据在获取的初始数据中不可用
  • React组件中的代码执行this.props.relay.forceFetch() ,这通常发生在程序员认为服务器端的数据可能因其他外部更改时
  • 当用户执行诸如更改要显示的项目数,图片大小等的操作时,React组件中的代码执行this.props.relay.setVariable(...) ,这需要更改最初获取的数据。

在重新获取期间,GraphQL使用(全局)节点ID调用nodeInterfacenodeInterface需要检索与该节点ID关联的服务器端对象。 使用该服务器端对象,GraphQL服务器可以返回客户端所需的附加/变体数据。

因此,如果永远不重新创建初始对象数据,则永远不需要节点ID。

有关详细信息,请参阅: https//medium.com/@khor/relay-graphql-de-mystifying-node-id-38757121b9c

细节

nodeInterface节点ID执行到服务器端对象解析,因此它总是看起来像:

var {nodeInterface, nodeField} = nodeDefinitions(
  (globalId) => {
    var {type, id} = fromGlobalId(globalId);

    if (type === 'ClassA') {
      // Get ClassA type of instance with id
      // E.g.,
      return ClassA.find_by_id(id)
    } else if (type === 'ClassB') {
      return ClassB.find_by_id(id)
    }

    ...
  }
)

由于需要重新获取的GraphQL类型需要Node ID,因此在GraphQL架构中您需要:

  • 请求GraphQL在创建GraphQL类型实例时使用globalIdField关键字自动生成节点ID
  • 告诉GraphQL GraphQL类型如何解析在重新获取期间提供的节点ID到相应的服务器端对象,这是您的interface : [nodeInterface]

从而:

var ClassAType = new GraphQLObjectType({
  name: 'ClassA',
  description: 'A',
  fields: () => ({
    id: globalIdField('ClassA'),

    ... other fields ...

  }),
  interfaces: [nodeInterface],
});

对于符合Relay标准的GraphQL服务器,具有全局ID的对象称为Node ,任何node都可以通过查询重新获取

{
  node: (id: "some global id") {
    id,
    ... on SomeType {
      someField
    }
  }
} 

Node接口用于GraphGL架构,可帮助您定义具有全局ID的Type。

检查全局对象标识及其规范详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM