6

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

我对什么 interface : [nodeInterface] 在 GraphQL 对象定义中的作用感到困惑。

4

2 回答 2

7

简答

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

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

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

在重新获取期间,GraphQLnodeInterface使用(全局)节点 ID调用,nodeInterface需要检索与该节点 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 类型需要节点 ID,因此在 GraphQL 模式中您需要:

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

因此:

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

    ... other fields ...

  }),
  interfaces: [nodeInterface],
});
于 2016-04-09T03:38:31.547 回答
5

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

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

Node接口用于 GraphGL 模式,它可以帮助您定义具有全局 id 的类型。

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

于 2015-09-05T10:33:22.630 回答