GraphQL не поддерживает произвольные поля, существует RFC для поддержки Map
типа , но он не был объединен / одобрен в спецификации.
Я вижу два возможных обходных пути, которые оба требуют немного изменить вашу схему.
Допустим, у вас есть следующая схема:
type Mutation {
saveBot(input: BotInput) : Boolean
}
input BotInput {
id: ID!
title: String
}
и входной объект:
{
"id": "123",
"title": "GoogleBot",
"unrelated": "field",
"ext_gps": "else"
}
Вариант 1: передать произвольные поля как AWSJSON
Вы изменили бы свою схему на:
type Mutation {
saveBot(input: BotInput) : Boolean
}
input BotInput {
id: ID!
title: String
arbitraryFields: AWSJSON // this will contain all the arbitrary fields in a json string, provided your clients can pluck them from the original object, make a map out of them and json serialize it.
}
Так чтовход в нашем примере будет следующим:
{
"id": "123",
"title": "GoogleBot",
"arbitraryFields": "{\"unrelated\": \"field\", \"ext_gps\": \"else\"}"
}
В вашем преобразователе вы можете взять строку arbitraryFields
, десериализовать ее и гидрировать значения объекта BotInput
перед передачей в источник данных..
Вариант 2: передать вход как AWSJSON
Принцип тот же, но вы передаете весь BotInput
как AWSJSON
.
type Mutation {
saveBot(input: AWSJSON) : Boolean
}
Вам не нужно выполнять гидратацию резолвера и вам не нужно менять клиента, но вы теряете проверку типа GraphQL, поскольку весь BotInput
теперь является BLOB-объектом.