GraphQL 查询 - 抑制非空错误并返回部分数据

Posted

技术标签:

【中文标题】GraphQL 查询 - 抑制非空错误并返回部分数据【英文标题】:GraphQL query - suppress non-null error and return partial data 【发布时间】:2020-08-31 18:20:14 【问题描述】:

我正在使用 AppSync 和 DynamoDB。有没有办法抑制非空错误并为结果省略非空字段的graphql查询返回部分数据?例如,如果我运行以下查询:

query GetPerson 
  getPerson(id: "123") 
    name
    active
  

在我的 AppSync 解析器中,我有决定是否返回 active 的值的逻辑。如果我决定不返回active,则会收到以下回复:


  "data": 
    "getPerson": null
  ,
  "errors": [
    
      "path": [
        "getPerson",
        "active"
      ],
      "locations": null,
      "message": "Cannot return null for non-nullable type: 'Boolean' within parent 'Person' (/getPerson/active)"
    
  ]

因为在我的架构中,active 字段不为空。是否有任何方法可以抑制此错误并返回部分数据(即name 的值)?我想得到这样的回应:


  "data": 
    "getPerson": 
      "name": "Jane Doe"
    
  ,
  "errors": [
    
      "path": [
        "getPerson",
        "active"
      ],
      "locations": null,
      "message": "Cannot return null for non-nullable type: 'Boolean' within parent 'Person' (/getPerson/active)"
    
  ]

【问题讨论】:

【参考方案1】:

没有。非 null 字段永远不应返回 null。

如果请求该字段并且它解析为 null,GraphQL 将返回错误。由于该字段不能为 null,GraphQL 将为父字段返回 null。如果该字段也是非空的,它会为 那个 字段的父字段返回空值......等等,直到它碰到一个可以为空的父字段或根(即data)。 spec 中描述了此行为:

如果在解析字段时抛出错误,则应将其视为该字段返回 null,并且必须将错误添加到响应中的“错误”列表中。

如果解析字段的结果为 null(因为解析该字段的函数返回 null 或发生错误),并且该字段是 Non-Null 类型,则抛出字段错误。错误必须添加到响应中的“错误”列表中...

由于 Non-Null 类型的字段不能为 null,因此字段错误会被传播以由父字段处理。如果父字段可能为null,则解析为null,否则如果是Non-Null类型,则字段错误进一步传播到其父字段...

如果从请求根到字段错误源的所有字段都返回Non-Null类型,那么响应中的“数据”条目应该为null。

如果active 为空可能,那么您不应该在您的架构中使其不可为空。

【讨论】:

以上是关于GraphQL 查询 - 抑制非空错误并返回部分数据的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 GraphQL 查询包含非空字段的可空数据?

如何自定义 GraphQL 查询验证错误消息

Apollo GraphQL 错误:必须提供查询根类型

GraphQL 查询返回错误“不能为不可为空的字段返回 null”

如何使用 Graphql-kotlin 查询同时返回数据字段和错误字段

Nestjs / GraphQL - Playground 为查询返回 Null 错误。我的解析器?