Проверка ввода AWS AppSync GraphQL - игнорировать дополнительные поля? - PullRequest
0 голосов
/ 02 мая 2019

В моей схеме есть тип input, который определяет множество атрибутов, как и предполагалось.Проблема в том, что то, что я посылаю в мутацию, которая сохранит эти объекты, это объект с произвольными полями, которые могут измениться.В настоящее время, если я отправляю атрибуты, не указанные в схеме, я получаю сообщение об ошибке:

Validation error of type WrongType: argument 'input' with value (...)
   contains a field not in 'BotInput': 'ext_gps' @ 'setBot'

Конкретно, мой тип input не указал атрибут exp_gps, и это поле было предоставлено.

Мой вопрос

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

1 Ответ

1 голос
/ 09 мая 2019

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-объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...