自定义输入类型的Apollo数组作为Mutation参数抛出“ __typename”:未知字段错误

时间:2019-04-23 11:32:17

标签: graphql apollo react-apollo apollo-client graphene-python

我不太清楚该错误是什么能够解决此问题。检查服务器控制台也不会显示任何描述性错误。我已经添加了与此问题相关的所有必要代码。

这是突变:

mutation SaveTrials($event: ID!, $input: [ResultTrialsInputType!]!) {
    saveTrials(event: $event, results: $input) {
        results {
            id
            trials
        }
    }
}

我在后端使用Graphene(Python),但是类型对应于以下内容:

input ResultTrialsInputType {
    id: ID
    person: ID!
    trials: [String]
}

重要的是以下Python代码:

class ResultTrialsInputType(graphene.InputObjectType):
    id = graphene.ID()
    person = graphene.ID(required=True)
    trials = graphene.List(graphene.String)

当我使用上述变体从阿波罗发送数据时,这就是要发送到API的内容:

{
    "operationName": "SaveTrials",
    "variables": {
        "event": "207e9f27-be66-4564-9c28-ac92ec44235d",
        "input": [
            {
                "id": "8eb80b8b-c93a-44b1-9624-e75436c13780",
                "trials": [
                    "32.1",
                    "92.2",
                    "12.1",
                    "12.2",
                    "23.2",
                    ""
                ],
                "__typename": "ResultTrialsObjectType",
                "person": "a6f18ab5-df23-421e-b916-73e569bf73ad"
            }
        ]
    },
    "query": "mutation SaveTrials($event: ID!, $input: [ResultTrialsInputType!]!) {\n  saveTrials(event: $event, results: $input) {\n    results {\n      id\n      trials\n      __typename\n    }\n    __typename\n  }\n}\n"
}

对此查询的响应是有关“ __typename”的错误:

{
    "errors": [
        {
            "message": "Variable \"$input\" got invalid value [{\"__typename\": \"ResultTrialsObjectType\", \"person\": \"a6f18ab5-df23-421e-b916-73e569bf73ad\", \"id\": \"8eb80b8b-c93a-44b1-9624-e75436c13780\", \"trials\": [\"32.1\", \"92.2\", \"12.1\", \"12.2\", \"23.2\", \"\"]}].\nIn element #0: In field \"__typename\": Unknown field.",
            "locations": [
                {
                    "line": 1,
                    "column": 34
                }
            ]
        }
    ]
}

在我应用程序的其他任何地方,其中输入参数不是预期的自定义对象数组。这是怎么回事?我是否以错误的方式设置了输入参数?还是我在这里想念东西?

我尝试将__typename手动添加到输入类型;但是什么也没发生。

谢谢!

编辑:由于某些原因,现在我正在检查这一点,__typename显示为ResultTrialsObjectType,但它应该是ResultTrialsInputType。这个值是如何产生的?是Apollo生成还是服务器生成并由Apollo提取?

1 个答案:

答案 0 :(得分:0)

您的模式指定ResultTrialsInputType具有三个字段:idpersontrials__typename是特殊的meta-field,它表示对象的类型-不应将其添加到架构中。实际上,任何以两个下划线are reserved开头的名称都不应用作字段名称。

如错误所示,问题在于__typename不是为ResultTrialsInputType指定的字段,但是无论如何您都在发送它。

Apollo将自动将__typename附加到您请求中的任何选择集(不是输入或变量值)。这样的查询:

query {
  foo {
    bar
  }
}

成为:

query {
  foo {
    bar
    __typename
  }
}

Apollo为响应中返回的每个对象都需要__typename才能到达effectively cache the response。但是,这意味着每次使用Apollo返回的data对象时,它在整个结构中都将具有__typename属性。

这归结为,通常来说,您不能也不应进行查询,先对响应进行变异,然后再将其用作其他查询或变异的输入。