Итак, год или около того назад в apollo-server (или react-apollo ?) было внесено обновление, которое полностью сломало старое использование опущенных входных данных, допускающих значение NULL, в запросах GraphQL.
До обновления вы могли определить что-то вроде:
Mutation {
editProfile(id: ID!, name: String, avatar: String)
}
И при вызове его на стороне клиента с опущенными входными данными скажите:
editProfile(id: "whateverid", name: "James")
у вас есть avatar как undefined в вашем распознавателе.
Теперь он установлен на null.
Проблема в том, что null является вполне допустимым значением для некоторых необязательных входных данных, например avatar. Таким образом, мы потеряли информацию в процессе и больше не можем определить разницу на стороне сервера между:
null (= выполнить нет обновление базы данных) иnull (= обновить базу данных)Я открыл ветку на Github об этом здесь: https://github.com/apollographql/apollo-сервер/issues/2056
Другой парень сделал то же самое год назад на Github react-apollo: https://github.com/apollographql/react-apollo/issues/1569
dacz опубликовал интересный ответ, который довольно хорошо резюмирует:
Nullable input when not presented within the query variables in apollo client, is getting called with null value. Client should not pass the whole input as null, it should omit it completely or pass it with undefined. Passing null may mean explicitly null the input. Same applied to input fields, so the server may react on explicitly resetting the value (presented in the input with null or do not handle it if omitted).
Обе темы до сих пор остаются нерешенными.
Есть ли у кого-нибудь чистое решение для этого?
Я только что проверил это поведение, используя [email protected], [email protected] и [email protected], и я не могу воспроизвести проблему. И аргументы, и поля входных объектов отображаются как неопределенные, если они опущены. Результаты согласуются независимо от того, использую ли я буквальные значения или переменные. Даже если я явно устанавливаю для переменной значение undefined, она все равно остается неопределенной на стороне сервера. Единственный способ увидеть нулевое значение на стороне сервера — это явно установить значение null.
Возможно, это была ошибка либо в apollo-client, либо в react-apollo, которая была недавно исправлена. Однако, если вы обновили свои библиотеки и все еще видите такое поведение, есть какой-то другой фактор, ответственный за это (вероятно, на стороне клиента). Сужение того, что это такое, потребует увидеть реальный код.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если это проблема, это не проблема с
apollo-server— вы можете легко проверить это, используя Playground с последней версией. Пропущенные поля ввода не будут определены внутри вашего распознавателя. Так работает GraphQL.js, сколько я себя помню.