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

时间:2019-06-25 09:59:25

标签: graphql apollo-server express-graphql graphql-tools

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

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

{
  Vehicles {
    Cars {
      id
      registration {
        id
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

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

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

因此给出了这样的模式:

type Query {
  cars: [Car!]!
}

type Car {
  registration: Registration!
}

和该查询

{
  cars {
    registrations
  }
}

registrationCar的任何一个null字段都将解析为以下内容,因为cars字段为非空且每个单独的Car也不得为null

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

如果您将汽车字段设为可空([Car!]),则错误将在此处停止:

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

但是,您可以使每个Car可为空(无论该字段是否为空),这将使错误在此停止并导致对象和null的数组(错误的汽车为null)。因此,将cars类型设为[Car]![Car]将会给我们:

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