哪些中继对象必须实现“节点”?

Posted

技术标签:

【中文标题】哪些中继对象必须实现“节点”?【英文标题】:Which relay objects must implement `Node`? 【发布时间】:2016-04-29 03:42:30 【问题描述】:

https://facebook.github.io/relay/graphql/objectidentification.htm 非常清楚Node 是什么以及它的行为方式,但它没有指定哪些对象必须实现它,或者如果你的对象不实现它会产生什么后果。是否有一组功能不起作用?这些对象是否完全被忽略?并非现有规范中的所有对象(例如pageInfo)都实现了它,因此它显然不是普遍需要的,但pageInfo 有点特殊。

【问题讨论】:

【参考方案1】:

另一种思考Node 接口的方式是实现它的对象可重新获取。可重取性实际上意味着一个对象有一个 ID,我可以使用它来识别和检索它;按照惯例,这些 ID 通常是不透明的,但会包含类型信息和该类型内的标识符(例如,字符串的 Base-64 编码,如“Account:1234”)。

Relay 将以两种方式利用可重取性:

在称为“diffing”的过程中,如果您已经拥有由 ID QWNjb3VudDoxMjM0 标识的对象的一些数据(例如,nameaddress 字段),然后您导航到一个视图,我们显示一些额外的字段(locationcreatedAt),然后 Relay 可以进行最小查询,“重新获取”节点但只请求丢失的字段。 与此相关,Relay 将区分连接,并使用Node 接口来填补那些缺失的数据(例如:通过一些导航组合,您可能拥有视图中某些项目的完整信息,但需要填写在location 中用于范围内的某些项目,或者您可以通过突变修改连接中的项目)。因此,在基本的分页中,Relay 通常最终会发出 first + after 查询来扩展连接,但如果您在真实应用程序中检查其网络流量,您还会看到它对项目进行 node 查询在连接内。

所以是的,pageInfo 没有实现 Node 是对的,这样做没有任何意义。

【讨论】:

也就是说:没有什么需要来实现Node,但是这样做的对象会被更有效地处理?我现在看到facebook.github.io/relay/graphql/connections.htm 提到“如果此字段返回实现 Node 的对象,Relay 可以执行某些优化,但是,这不是使用 Relay 的严格要求。” 正确。我不想对此过于规范,但一个好的经验法则可能是为您的业务域中的“核心”对象实现它,特别是那些可以通过***路由导航到的对象,并且出现在连接中。当然,最佳方法会因应用程序而异,但如果您可以廉价地实现Node(而且您经常可以),那么至少对于我在上面的经验法则中提到的那些情况,您可能会从中受益。

以上是关于哪些中继对象必须实现“节点”?的主要内容,如果未能解决你的问题,请参考以下文章

在跨网络部署 Corda 节点时,哪些 JAR 必须完全相同?

如何从两个不同的中继连接中删除共享节点?

增量中继基于增量中继与机会中继的协同通信的matlab仿真

自己动手写区块链之交易中继

自己动手写区块链之交易中继

MYSQL实现高可用MHA