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

Posted

技术标签:

【中文标题】自定义输入类型的 Apollo 数组作为 Mutation 参数抛出“__typename”:未知字段错误【英文标题】:Apollo Array of Custom Input types as Mutation argument throws "__typename": Unknown field error 【发布时间】:2019-09-12 13:58:08 【问题描述】:

我什至不太明白能够解决这个问题的错误是什么。检查服务器控制台也没有显示任何描述性错误。我已添加与此问题相关的所有必要代码。

这里是突变:

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】:

您的架构指定 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 属性。

这归结为,一般来说,您不能也不应该进行查询,对响应进行变异,然后转身将其用作另一个查询或变异的输入。

【讨论】:

以上是关于自定义输入类型的 Apollo 数组作为 Mutation 参数抛出“__typename”:未知字段错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-apollo 自定义 InputTypes

如何使用 apollo 缓存来匹配作为子数组/子 ID 列表的输入变量?

如何手动将 apollo 自定义标量映射到客户端类型

在自定义函数中使用 SQL 查询作为数组参数(输入)

Apollo Android (GraphQL) 自定义类型构建文件警告:“无法为最终字段赋值”

Apollo Mutation 可以返回自定义结果对象吗?