Graphql ID разрешается как строка, даже если она целочисленная - PullRequest
0 голосов
/ 24 января 2020

Я новичок в graphql и надеюсь, что кто-то может объяснить мне этот тип идентификатора, который всегда является строкой.

Как печально в документах:

Скалярный тип идентификатора представляет уникальный идентификатор, часто используемый для повторного извлечения объекта или в качестве ключа для кэша.

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

Хорошо, поэтому я могу использовать int, но как тогда я получить мой идентификатор как целое число на стороне клиента?

Причина проста, скажем, у меня есть тип Book с идентификатором типа ID и отношением author_id типа Int. Также у меня есть тип автора с идентификатором типа ID. И после того, как я получу книгу и автора, у меня будет book.author_id int и строка author.id, но это одно и то же число!

Что мне делать? Использовать везде ID даже для многих, для многих отношений? Создать новый тип скалярного идентификатора, который можно использовать в качестве идентификатора для повторной выборки, но будет иметь тип Int?

1 Ответ

2 голосов
/ 24 января 2020

Из spe c:

Тип идентификатора сериализуется так же, как String; однако он не предназначен для восприятия человеком. Несмотря на то, что он часто имеет номер c, он всегда должен сериализоваться в виде строки ... GraphQL соответствует c формату идентификатора и сериализуется в строку, чтобы обеспечить согласованность во многих форматах, которые может представлять идентификатор, из небольших чисел с автоматическим приращением, к большим 128-битным случайным числам, к кодированным в base64 значениям или строковым значениям в формате, подобном GUID.

Неясно, почему клиенту нужно сравнивать идентификаторы в этом контексте - столбцы типа author_id как правило, в любом случае должен быть скрыт от клиента, поскольку схема отображает только связанный объект, а не поля, которые используются только для связывания объектов. Тем не менее, идентификатор - это просто идентификатор, и клиент не должен заботиться о том, является ли он строкой или целым числом, если он согласован. Если у вас есть одно поле, возвращающее целое число (Book.author_id), а другое - строку (Author.id), то это проблема для вашей схемы.

Скаляр ID может использоваться для любого числа полей, а не только одно поле (которое может или не может быть названо id). Точно так же, если вы хотите использовать Int или String в качестве типа для поля id, вы можете - это не повлияет на способность Apollo кешировать ваши результаты.

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