首页 > 解决方案 > AWS AppSync GraphQL - 使用联合作为突变返回导致错误

问题描述

我正在使用 AWS AppSync 创建一个 GraphQL 架构,并且我想将其Union用作突变返回。我想这样写突变:

mutation addUpdateTariff($tariff: TariffInput!, $seasonalTimeTariff: [SeasonalTimeTariffInput!]) {
  addUpdateTariff(tariff: $tariff, seasonalTimeTariff: $seasonalTimeTariff) {
    id
    type
    values {
      ... on SteppedTariff {
        endDate
      }
      ... on SeasonalTimeTariff {
        endDate
        peakConsumption
      }
    }
  }
}

但我收到了这个错误:

Request failed with status code 400

该字段values可以是SteppedTariff或类型SeasonalTimeTariff,取决于addUpdateTariff突变的输入。据我搜索,Union仅在查询中使用,我没有找到一些文档告诉它不能以不同的方式使用。

我错过了什么或者我真的不能用Union这种方式吗?

架构:

type Tariff {
  id: ID!
  type: TariffType!
  values: [TariffValue!]
}

type SteppedTariff {
  endDate: AWSDate
}

type SeasonalTimeTariff {
  endDate: AWSDate
  peakConsumption: Float
}

union TariffValue = SeasonalTimeTariff | SteppedTariff

测试关税值的不同模式:

  1. values: [String]

询问:

mutation addUpdateTariff($tariff: TariffInput!, $seasonalTimeTariff: [SeasonalTimeTariffInput!]) {
  addUpdateTariff(tariff: $tariff, seasonalTimeTariff: $seasonalTimeTariff) {
    id
    type
    values
  }
}

回复:

{
  "data": {
    "addUpdateTariff": {
      "id": "843eadcf-48bd-4d58-93ec-8bbe96db3635",
      "type": "SeasonalTime",
      "values": [
        "{endDate=2019-02-02}"
      ]
    }
  }
}
  1. values: [SeasonalTimeTariff]

询问:

mutation addUpdateTariff($tariff: TariffInput!, $seasonalTimeTariff: [SeasonalTimeTariffInput!]) {
  addUpdateTariff(tariff: $tariff, seasonalTimeTariff: $seasonalTimeTariff) {
    id
    type
    values {
      endDate
    }
  }
}

回复:

{
  "data": {
    "addUpdateTariff": {
      "id": "7f77c5d9-2b06-4bb8-a678-10996addc4e1",
      "type": "SeasonalTime",
      "values": [
        {
          "endDate": "2019-02-02"
        }
      ]
    }
  }
}

标签: graphqlaws-appsync

解决方案


您绝对可以在突变的返回类型上使用联合。确保您__typename在值中包含该字段。您的解析器模板应返回如下内容:

{
  "id": 1,
  "type": "?",
  "values": [
    {
      "__typename": "StepTariff",
      "endDate": "2019-01-01"
    },
    {
      "__typename": "SeasonalTimeTariff",
      "endDate": "2019-01-01",
      "peakConsumption": 1.0
    }
  ]
}

推荐阅读