#graphql
#graphql
Вопрос:
Простая таблица с одной двумя строками. ID (увеличивающий int) и test_value (ТЕКСТ, обнуляемый).
1. Запрос
query getData($test_value:String!) {
testtable(where: {test_value: {_eq: $test_value}}) {
test_value
}
}
Переменные
{"test_value":null}
Результат
{
"errors": [
{
"extensions": {
"path": "$.selectionSet.testtable.args.where.test_value._eq",
"code": "validation-failed"
},
"message": "unexpected null value for type "String""
}
]
}
Я ожидаю, что это правильно.
2. Мутация
mutation InsertData($test_value: String!) {
insert_testtable(objects: {test_value: $test_value}) {
affected_rows
}
}
Переменные
{"test_value":null}
Результат
{
data: {
insert_testtable: {
affected_rows: 1
}
}
}
Я ожидаю и ошибку (из-за test_value:String!
объявления), но я ее не понимаю.
Почему?
PS проверяемая схема выглядит следующим образом: id: Int!
test_value: String
Комментарии:
1. Не могли бы вы добавить записи схемы для запроса и мутации в сообщение? Пока вы этим занимаетесь, вы можете проверить, вставили ли вы неправильный результат мутации в свой вопрос.
2. используйте / передавайте «внешний» объект в качестве переменной (
$where
) …$test_value: String!
означает, что переменная (определенная клиентом / запросом) не обнуляется, но тип ввода API / BE может быть другим, читайте документы / спецификации3. @fedonev спасибо! Исправлен результат и добавлена некоторая информация о схеме (хотя я не уверен, что это то, о чем вы просите)
4. Недостающий ключ — это определение мутации. Найдите
insert_testable
строку в вашей схеме нижеtype Mutation {
. Как говорит @xadm, подозрение заключается в том, чтоinsert_testable
определение допускает обнуляемые входные данные. Вы поделились тем, как клиент вызывает мутацию, но не тем, как она определена в схеме. Это хороший вопрос, продолжайте в том же духе!5. запрос / мутация не имеет значения… вы смешиваете следующий / 3-й элемент — валидатор оператора, вероятно, по какой-то причине
String
его нельзя сравнить сnull
использованием_eq
—null
недопустимое строковое значение,null
поскольку аргументы [validation] используются как индикатор их отсутствия, а не значение
Ответ №1:
Мое понимание вашей проблемы: ваша схема имеет мутацию insert_testtable
, которая принимает нулевой String
аргумент. Когда вы отправляете именованную операцию мутации с ненулевой String!
переменной, сервер GraphQL не отвечает с ошибкой.
В спецификации GraphQL говорится, что это ожидаемое поведение для мутаций и запросов. В спецификации говорится, что если тип в схеме имеет значение null и имеет тот же тип, что и переменная, операция должна считаться действительной. Это то, что происходит с вашей мутацией.
Если вы не видите аналогичного поведения для запроса, возможно, ваша реализация сервера GraphQL отличается от спецификации. Вы можете проверить документы вашего сервера или их проблемы с GitHub.
Как бы то ни было, я проверил, что AppSync, реализация AWS GraphQL, обеспечивает ожидаемое поведение как для запросов, так и для мутаций.
Комментарии:
1. О! Так что, вероятно, Хасура играет со мной злую шутку. Спасибо за разъяснения!