Почему я могу выполнить функцию мутации с параметром null с типом `String!`?

#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. О! Так что, вероятно, Хасура играет со мной злую шутку. Спасибо за разъяснения!