GraphQL 中如何处理字段为空的情况

在 GraphQL 开发中,对于查询数据中存在空值的情况,我们需要采取一些特别的处理来避免错误发生。本文将介绍 GraphQL 中如何处理字段为空的情况,并提供示例代码来帮助您理解。

问题

假设我们有一个简单的 GraphQL 查询,它返回游戏列表及它们的相关信息。

----- -
  ----- -
    --
    ----
    -----------
    -----
    --------- -
      ----
      -------
    -
  -
-

我们可以看到,上述查询包含了一个嵌套字段 publisher,这个字段关联了 GamePublisher 两个实体。有时候,一些游戏可能没有对应的出版商,这时查询就会发生错误。因此,我们需要在 GraphQL 中如何处理这种情况呢?

方案

GraphQL 中提供了两种解决方法:使用 nullable 和 non-null types。

Nullable types

在 GraphQL 中,默认情况下,所有的 types 都是可空的(nullable)。这意味着一个字段可以返回 null。因此,我们可以通过将 Publisher 类型定义为可空类型来处理字段为空的情况。

---- --------- -
  ----- ------
  -------- ------
-

---- ---- -
  --- ---
  ----- -------
  ------------ ----
  ------ ------
  ---------- ---------
-

----- -
  ----- -
    --
    ----
    -----------
    -----
    --------- -
      ----
      -------
    -
  -
-

上述代码中,我们将 Publisher 类型定义为可空类型。如果某个游戏没有出版商,查询会返回 null

Non-null types

除了可空类型,GraphQL 还提供了非空类型(non-null types)。对于值类型(如 IDIntFloatBooleanEnum),我们可以在定义时在类型名称后添加一个感叹号来表示它不能为 null。同样的,我们也可以在字段类型定义时添加一个感叹号来表示它不能为 null。

---- --------- -
  ----- -------
  -------- ------
-

---- ---- -
  --- ---
  ----- -------
  ------------ ----
  ------ ------
  ---------- ----------
-

----- -
  ----- -
    --
    ----
    -----------
    -----
    --------- -
      ----
      -------
    -
  -
-

在上述代码中,我们将 Publisher 类型定义为非空类型,这意味着每个游戏都必须有一个出版商,否则查询会返回错误。

结论

以上就是 GraphQL 中如何处理字段为空的情况的方法,您可以根据实际业务情况选择采用哪种方案。但我们建议您优先考虑使用 nullable types,因为它能够更好地支持数据中的变化,在 GraphQL 中以及其他软件系统中取得更好的互操作性。

最后,我们提供一份附带注释的示例代码,希望能够帮助您更好地理解 GraphQL 中的 nullable 和 non-null types 的处理方式。

- -------- -----
- ----
---- --------- -
  ----- ------
  -------- ------
-

- --- -- -------- ------ --------- ---- ------- ------ ---------- --------- --
---- ---- -
  --- ---
  ----- -------
  ------------ ----
  ------ ------
  ---------- ---------
-

- -------- -----
- ----- ------ ----------- ------ --- --------- --
- --- -- -------- ------ --------- ---- -------- ------ ---------- --------- --
---- --------- -
  ----- -------
  -------- ------
-

---- ---- -
  --- ---
  ----- -------
  ------------ ----
  ------ ------
  ---------- ----------
-

- ------
----- -
  ----- -
    --
    ----
    -----------
    -----
    - ---------- ----
    --------- -
      ----
      -------
    -
  -
-

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67399349317fbffedf177db4