GraphQL错误FieldsConflict:字段具有不同的列表形状

时间:2019-06-21 00:00:08

标签: graphql aws-appsync

我正在使用具有以下(简化)模式的AWS AppSync的GraphQL服务器:

type Query {
  getIssue(id: String!): Issue
}

type Issue {
  id: String!
  data: IssueData!
}

type Event {
  id: String!
  time: AWSDateTime!
  status: [String]
}

type Payment {
  id: String!
  amount: Int!
  status: String
}

union IssueData = Event | Payment

当我进行包含inline fragments的查询以在status字段中选择Event作为PaymentIssue/data类型的子代时,我收到 FieldsConflict 错误:

query getIssue($id: String!) {
  getIssue(id: $id) {
    id
    data {
      ... on Event {
        time
        status
      }
      ... on Payment {
        amount
        status
      }
    }
  }
}
  

FieldsConflict类型的验证错误:状态:字段具有不同的列表形状@'getIssue / data'

这大概是由于Event/status字段返回一个字符串数组,而Payment/status字段返回了单个字符串造成的。

为什么GraphQL认为这是冲突?我应该如何构造查询以允许访问两种数据类型的状态字段?

请注意,我使用的是联合而不是扩展接口,因为IssuePayment类型没有通用的数据结构。

1 个答案:

答案 0 :(得分:1)

来自spec

  

如果在执行过程中遇到具有相同响应名称的多个字段选择,则要执行的字段和参数以及结果值应明确。因此,对于同一个对象可能会遇到的任何两个字段选择只有在它们相等时才有效。

您可以通过为一个或两个字段提供字段别名来解决此问题:

query getIssue($id: String!) {
  getIssue(id: $id) {
    id
    data {
      ... on Event {
        time
        eventStatus: status
      }
      ... on Payment {
        amount
        status
      }
    }
  }
}

重命名架构中的一个或两个字段显然也可以解决该问题。