Назначить несколько типов для поля в GraphQL - PullRequest
0 голосов
/ 21 октября 2018

В моей базе данных поле Event динамически заполнялось массивом строк, а некоторые заполнялись вручную текстом (без массива).Когда я выполняю свой запрос, результаты, которые были заполнены только строкой (не в массиве), отображаются как нуль.

Поле в схеме: Event: [String]

Есть ли способв GraphQL назначить для поля оба типа [String] и String?Я попробовал следующее, но получил синтаксическую ошибку:

union test = [String] | String

Event: test

Примечание. Назначенные вручную значения отсутствуют в массиве.

1 Ответ

0 голосов
/ 21 октября 2018

Из спецификации:

Объединения GraphQL представляют собой объект, который может быть одним из списка типов объектов GraphQL, но не предусматривает никаких гарантированных полей между этими типами.

Союзы не могут включать скаляры или списки;они могут включать только типы.Это означает, что союз не подходит для того, что вы пытаетесь достичь.Более того, поле может возвращать только один скаляр, тип, объединение или интерфейс, поэтому нет никакого способа вернуть один из чего-либо или массив этого чего-либо.

Однако вы можете использовать собственный скаляр для созданияповедение, которое вы ищете.Документы Apollo прекрасно описывают, как создавать и реализовывать свои собственные скаляры, так что вы можете найти там .Для вашего конкретного случая, однако, я думаю, что уже есть скаляр, который бы сработал - graphql-type-json .Я полагаю, что и строка, и массив строк будут допустимыми значениями JSON, поэтому они должны работать с этой библиотекой.

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

...