在Relay中,节点接口和全局ID规范起什么作用?

我开始使用relay-starter-kit并且通过Relay和GraphQL文档工作。 但是有不less地方是无法解释和神秘的。

我认真地阅读了大量关于所有这些事情的文件,但是对于下面的问题找不到任何令人满意的解释:

这个是来做什么的? 我把日志,但它甚至从来没有被称为:

 var {nodeInterface, nodeField} = nodeDefinitions( (globalId) => { var {type, id} = fromGlobalId(globalId); if (type === 'User') { return getUser(id); } else if (type === 'Widget') { return getWidget(id); } else { return null; } }, (obj) => { if (obj instanceof User) { return userType; } else if (obj instanceof Widget) { return widgetType; } else { return null; } } ); 

这个的实际效果是什么:

 interfaces: [nodeInterface], 

也许与此有关, node字段在这里做什么:

 var queryType = new GraphQLObjectType({ name: 'Query', fields: () => ({ node: nodeField, // Add your own root fields here viewer: { type: userType, resolve: () => getViewer(), }, }), }); 

id字段的魔法是什么? globalIdField是什么?

我在我的数据库中有一个id ,并认为我可以在我的GraphQL对象中使用它:

代替:

 id: globalIdField('User'), 

我想用我的数据库ID:

 id: { type: GraphQLID, description: 'The identifier' }, 

但是,如果我这样做,我在浏览器中得到一个错误,说RelayQueryWriter: Could not find a type name for record '1'

我可以通过添加__typename到我的组件容器中继查询来摆脱这个错误,但这似乎是错误的。

如果你能在这里提供一些更深层次的内容和更好的解释并且加强官方文件,那将是非常好的。

谢谢

当中继需要重新获取对象时, Node根字段与全局唯一的ID结合起来。 当您调用this.props.relay.forceFetch()或者当您为全局ID已知的对象的查询添加字段时会发生重新获取,因为它已被部分获取。

在这样的情况下,Relay将短路常规查询并直接使用其全局ID和node根调用来执行对象的查询。

例如

假设当第一次parsing这个查询时$showCommentsfalse

 query { viewer { stories(first: 10) { edges { node { id, comments(first: 10) @include(if: $showComments) { author, commentText } text, } } } } } 

这将导致一些故事的ID和text的提取,其ID现在已知。

想象一下,在将来某个时候,variables$showComments变成了true 。 中继将仅使用node根域重新获取所需的数据。

 query { node(id: "ABC123") { fragment on Story { comments(first: 10) { author, commentText } } } node(id: "DEF456") { fragment on Story { comments(first: 10) { author, commentText } } } node(id: "GHI789") { fragment on Story { comments(first: 10) { author, commentText } } } ... } 

这取决于几件:

  1. 每个对象必须具有全局唯一的ID,或者由types/ ID对( globalIdField帮助程序执行此操作并生成base64编码的string)来标识。
  2. 服务器必须知道如何从全局唯一的IDparsing对象,反之亦然。 这是nodeDefinitions的用途。
  3. 任何希望被这个系统重新引用的对象都必须实现nodeInterface

另见: https : //facebook.github.io/relay/docs/graphql-object-identification.html#content