Фильтровать или различать встроенные и пользовательские типы graphql

Я пытаюсь найти способ отличить (и отфильтровать) встроенные типы от моих пользовательских типов при запуске introspectionQuery против API-интерфейса graphql. Кажется, в выводе нет ничего надежного, чтобы определить, какие типы являются встроенными (кроме __ перед «системными» типами).

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

Действительно ли нет систематического способа различить их?

Вы когда-нибудь находили запрос, чтобы сделать это?

pkatsourakis 07.01.2020 22:41

@pkatsourakis, к сожалению, нет. Но, как говорится в ответе ниже, они довольно прямолинейны и вряд ли изменятся :)

ViggoV 08.01.2020 10:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
2
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хотя спецификация делает определяет скалярные типы, которые должна включать каждая реализация, и указывает, как эти скаляры должны сериализоваться и анализироваться, на самом деле она не проводит различия между этими встроенными скалярами и любыми другими, которые может предоставлять служба GraphQL. Функционально нет разницы между «встроенным» типом и «настраиваемым».

Имеется пять встроенных скаляров указано в спецификации. Вряд ли они изменятся в будущем.

  • Интерн.
  • Плавать
  • Нить
  • логический
  • Я БЫ

Есть также несколько «мета»-типов, которые явно используются для самоанализа. Они обозначены здесь.

  • __Схема
  • __Тип
  • __Поле
  • __InputValue
  • __Энумвалуе
  • __TypeKind
  • __Директива
  • __DirectiveLocation

Имена, начинающиеся с двух символов подчеркивания (__), являются зарезервированными именами, поэтому любые типы с именами, начинающимися таким образом, можно смело классифицировать как «встроенные».

Из вашего вопроса неясно, с какой целью вы пытаетесь провести различие между «встроенными» и «настраиваемыми» типами, но я предполагаю, что для большинства целей мы будем рассматривать вышеперечисленное как «встроенные» типы и любые другие "на заказ".

Мой вариант использования — повторно используемая тестовая установка, в которой я перебираю типы, возвращаемые запросом самоанализа (предоставляемым модулем graphqlnpm), и проверяю такие вещи, как описание. Это также полезно в таких сценариях, как создание документации для API или создание интроспективного браузера данных. Спасибо за ссылки, я просто пойду по спецификации :)

ViggoV 15.05.2019 14:43
Ответ принят как подходящий

Вы можете использовать функцию isIntrospectionType:

import { buildSchema, isIntrospectionType } from 'graphql';


const schema = buildSchema(source);

for (const type of Object.values(schema.getTypeMap())) {
  if (isIntrospectionType(type)) continue;

  // do something...
}

PS. Вы также можете использовать isSpecifiedScalarType для фильтрации скалярных узлов, таких как ID, Int и т. д.

Другие вопросы по теме