如何理解 GraphQL 中的空边和节点
Posted
技术标签:
【中文标题】如何理解 GraphQL 中的空边和节点【英文标题】:How to understand null edges and nodes in GraphQL 【发布时间】:2020-01-14 00:48:35 【问题描述】:GraphQL 中关系的良好实践是使用带有 edge 和 node 元素的 connection 模型。还建议 edge 和 node 都可以为空。这就是例如我使用的 graphene-sqlalchemy 将映射 SQL 关系。
我的问题是:为什么?就我从 SQL 数据库中提供关系数据的 API 而言,我看不到任何边缘或节点将是 null
的情况。因此,如果我在前端使用静态类型语言(如 Typescript 或 Elm),我会发现自己正在编写一个样板来处理永远不会发生的情况。
在抽象数据模型方面我应该如何理解这些null
s? “没有任何联系”对我来说可以翻译为没有边缘的联系。为什么我需要null
边缘? null
节点更困扰我“有连接,但另一端什么都没有”?请在这里向我解释原因。
【问题讨论】:
【参考方案1】:使用连接将您的架构与Relay specification 对齐——在不使用 Relay 时这是否是一种好的做法值得商榷。
在 Relay 中,边和节点可以为空,因为这是规范隐含指定的。
造成这种情况的实际原因是 GraphQL 错误 work 的方式。当解析字段时遇到执行错误时,该字段将解析为 null。但是,如果该字段也是非空的,它不能实际上解析为空,因此 GraphQL 将使整个父字段改为空。如果父字段也是非空的,那么它将使 its 的父字段为空...等等。 GraphQL 错误会以这种方式“冒泡”,直到遇到可空字段或到达 data
根字段(始终可为空)。
换句话说,通过使字段和边可以为空,我们允许节点在解析时出错,同时仍然返回有关边本身的信息,更重要的是,仍然返回所有其他边。如果节点和边都不为空,则单个节点内的错误将导致edges
字段本身解析为空。通过使这些字段可以为空,我们有效地支持 GraphQL 即使在执行过程中遇到错误也能返回部分响应。
【讨论】:
以上是关于如何理解 GraphQL 中的空边和节点的主要内容,如果未能解决你的问题,请参考以下文章
GatsbyJs - 如何处理来自 Contentful 插件的空 graphql 节点