Николай Ланец
16 дек. 2018 г., 10:44

GraphQL. String cannot represent a non string value.

С момента недавнего обновления graphql-js вот такая ошибка часто появляется "String cannot represent a non string value". На самом деле это не совсем ошибка, а предсказуемое поведение. Просто graphql стал более строгий к типам данных. Если у вас в схеме указано, что поле типа Int, то нельзя в запросе передать, например, строковое "1", надо именно передавать именно числовое 1, даже если нам ясно, что "1" запросто конвертируется в 1, и раньше graphql это позволял.

Что делать? Приложите максимум усилий к тому, чтобы все-таки поправить схему и свой код, чтобы типы везде соответствовали. Иначе дальше будет хуже.
Но если дело срочное, некогда схему особо переделывать и запросы пофиксить, а работу надо срочно восстановить, то можно сделать следующий хак: задать толю тип данных какой-нибудь свой, например IntOrString. Если вы сразу попробуете схему собрать, то получите ошибку Couldn't find type IntOrString in any of the schemas. Все верно, потому что это наше кастомное поле и оно нигде не объявлено. Возьмем и допишем его в схему
scalar IntOrString
Вот теперь можно пересобирать схему и теперь передавать можно как строковые значения, так и вообще почти все что угодно, в том числе json. Этот момент я специально отмечаю, так как теперь вопрос валидации данных с graphql переходит на ваши плечи, почему и говорил, что лучше схему привести в порядок и передавать только то, что положено. Но случаи бывают разные (к примеру, как у меня сейчас, что ПО обновилось, и мобильное приложение разваливается, потому что вместо числа строку шлет, а мобильное приложение нельзя вот так на раз-два залить новое в стор и обновить на всех мобильниках).

Уточнение: у меня используется prisma+apollo и пример приведен для моего стека. У вас могут быть отличия, но принцип тот же. То есть ваша задача просто схему поправить в рамках ваших техпроцессов.

Добавить комментарий