【问题标题】:GraphQL error FieldsConflict: fields have different list shapesGraphQL 错误 FieldsConflict:字段具有不同的列表形状
【发布时间】:2026-02-12 21:20:05
【问题描述】:

我正在使用具有以下(简化)架构的 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 的查询以在Issue/data 字段中选择status 作为EventPayment 类型的子项时,我得到一个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 类型没有共同的数据结构。

【问题讨论】:

    标签: graphql aws-appsync


    【解决方案1】:

    来自spec

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

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

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

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

    【讨论】: