处理子查询中的 graphql 模式拼接错误

Posted

技术标签:

【中文标题】处理子查询中的 graphql 模式拼接错误【英文标题】:Handle graphql schema stitching error in child query 【发布时间】:2019-11-07 03:17:25 【问题描述】:

我是 graphql 的新手,想了解这里的概念。我有这个 graphql 模式(使用图形工具缝合)。并非所有汽车都有注册。因此,如果我查询 5 辆汽车,而一辆汽车没有注册(没有 id 来链接汽车和注册),我的整个查询都会失败。

我该如何处理并为那 1 辆车返回 null 并为其他 4 辆车返回注册详细信息?


  Vehicles 
    Cars 
      id
      registration 
        id
      
    
  

【问题讨论】:

【参考方案1】:

如果您将字段标记为 non-null(通过将 ! 附加到类型)然后将该字段解析为 null,GraphQL 将总是抛出错误 - 这是不可避免的。如果在您的 API 的正常操作中某个字段可能最终为 null,您可能应该将其设为可空

但是,错误 "bubble up" 到最近的可为空字段。

所以给定这样的架构:

type Query 
  cars: [Car!]!


type Car 
  registration: Registration!

还有这个查询


  cars 
    registrations
  

将任何Carregistration 字段解析为null 将导致以下结果,因为cars 字段不为空并且每个单独的Car 也不得为null


  "data": null,
  "errors": [...]

如果您将 cars 字段设置为可空 ([Car!]),则错误将停止:


  "data": 
    "cars": null
  ,
  "errors": [...]

但是,您可以将每个Car 设为可空(无论该字段是否为空),这将使错误停在那里并产生一组对象和空值(空值是出错的汽车)。所以制作cars 类型[Car]![Car] 会给我们:


  "data": 
    "cars": [..., ..., null]
  ,
  "errors": [...]

【讨论】:

以上是关于处理子查询中的 graphql 模式拼接错误的主要内容,如果未能解决你的问题,请参考以下文章

需要通过模式拼接来查找连接订阅的错误

通过查询模式通过子对象访问父对象的受保护字段

Gatsby - 如何使用 GraphQL 查询 src/data/ 子文件夹中的所有 YAML

Redshift 中的 DAU WAU MAU 错误:[Amazon](500310) 无效操作:由于内部错误,不支持此类关联子查询模式;

子查询失败:由于内部错误,不支持此类关联子查询模式;

由于内部错误,不支持相关子查询模式 - 不存在相关子查询