Apollo Массив пользовательских типов ввода в качестве аргумента мутации. «__Typename»: неизвестная ошибка поля - PullRequest
0 голосов
/ 23 апреля 2019

Я не совсем понимаю, в чем же ошибка, чтобы быть в состоянии решить эту проблему.Проверка консоли сервера также не показывает описательную ошибку.Я добавил весь необходимый код, связанный с этой проблемой.

Вот мутация:

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

Я использую графен (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 голосов
/ 23 апреля 2019

В вашей схеме указано, что ResultTrialsInputType имеет три поля: id, person, trials.__typename - это специальное мета-поле , которое обозначает тип объекта - его не следует добавлять в схему.Фактически, любые имена, которые начинаются с двух подчеркиваний , зарезервированы и не должны использоваться для имен полей.

Как показывает ошибка, проблема в том, что __typename не является полем, котороеуказано для ResultTrialsInputType, но вы все равно отправляете его.

Apollo автоматически присоединит __typename к любым наборам выбора в вашем запросе ( не входам или значениям переменных).Таким образом, запрос, подобный следующему:

query {
  foo {
    bar
  }
}

становится:

query {
  foo {
    bar
    __typename
  }
}

Аполлону нужно __typename для каждого объекта, возвращенного в вашем ответе, чтобы эффективно кешировать ответ .Однако это означает, что каждый раз, когда вы работаете с data объектом, возвращенным Apollo, он будет иметь свойства __typename по всей своей структуре.

То, к чему это сводится, это то, что, вообще говоря, вы не можете ине должен делать запрос, видоизменить ответ, а затем развернуться и использовать его в качестве входных данных для другого запроса или мутации.

...