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

Jon*_*vey 2 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
Run Code Online (Sandbox Code Playgroud)

当我进行包含内联片段的查询以选择status作为字段中anEventPaymenttype的子项时Issue/data,我收到FieldsConflict错误:

query getIssue($id: String!) {
  getIssue(id: $id) {
    id
    data {
      ... on Event {
        time
        status
      }
      ... on Payment {
        amount
        status
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

这大概是由Event/status返回字符串数组的字段引起的,而该Payment/status字段返回单个字符串。

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

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

Dan*_*den 6

规范

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

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

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

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