GraphQL联合和冲突类型

时间:2017-10-16 16:01:30

标签: javascript graphql apollo

我的项目有问题,我在互联网上找不到任何解决方案。情况就是这样。

  • 我有两种类型的联盟(“DataResult”)(“预告片”和“节目”)
  • 我的“区域”类型带有“数据”字段(数组“DataResult”)
  • “Teaser”& “Program”具有相同的“title”字段,具有不同的类型(String vs String!)

以下是“Zone”,“Teaser”和“Program”模式的部分:

type Program {
    title: String
}

type Teaser {
    title: String!
}

union DataResult = Teaser | Program

type Zone {
    (...)
    data: [DataResult!]
}

当我尝试按照下面的查询部分所述查询区域数据时,我从graphQL收到错误。

zones {
    ...zoneFieldsWithoutData
    data {
        ... on Program {
            ...programFields
        }
        ... on Teaser {
            ...teaserFields
        }
    }
}

这是错误:

Error: GraphQL error: Fields \"title\" conflict because they return conflicting types String and String!. Use different aliases on the fields to fetch both if this was intentional

我无法使用别名,因为规范需要所有“DataResult”实体的相同属性名称。我该怎么办?

此外,即使我为“标题”设置相同的类型,我也会在控制台中发出很多关于“缺少字段”的警告....

PS:我使用Vanilla Apollo作为graphQL客户端(在服务器端)

3 个答案:

答案 0 :(得分:0)

它是根据规范实现的: 参见3.a,网址为:http://facebook.github.io/graphql/draft/#SameResponseShape()

有关更多详细信息,请参见https://github.com/graphql/graphql-js/issues/1361#issuecomment-393489320

答案 1 :(得分:0)

使用interface为我解决了这个问题,包括“缺少字段”-错误(尽管这意味着字段必须与我认为的类型相同)。

类似的东西

interface DataResult {
    title: String!
}

type Program implements DataResult {
    // Not sure if this can be empty?
}

type Teaser implements DataResult {
    // Not sure if this can be empty?
}

type Zone {
    (...)
    data: [DataResult!]
}

答案 2 :(得分:0)

我知道您不能使用别名,但对于其他可以使用的人(包括我):

github 的简单答案是使用字段别名:

do.call(rbind, my_list)