Как мутация GraphQL узнает, какой узел он модифицирует?Существует ли уникальный и глобальный идентификатор узла для каждого узла в базе данных? - PullRequest
0 голосов
/ 26 февраля 2019

Я изучаю GraphQL с помощью полезного учебника Робина Виеруха (https://www.robinwieruch.de/getting-started-github-graphql-api/)

. Мне не совсем ясно, как мутация для конкретной конечной точки «знает», какой объект она модифицирует (запрашиваеткажется, работает, обходя дерево БД сверху вниз).

Например, с мутацией GitHub GraphQL API addReaction (https://developer.github.com/v4/mutation/addreaction/), у нас есть subjectID, о котором говорят документы«Идентификатор узла субъекта, который нужно изменить». Хорошо, но, возможно, во всем GitHub может быть несколько вещей, к которым можно добавить реакцию. Означает ли это, что этот subjectID уникален во всехвесь GitHub, так что API GraphQL «автоматически» знает, где именно во всех многих элементах GitHub он должен добавить (например) «палец вверх»? Если это не так, как он узнает?в этом случае существует ли этот уникальный и глобальный идентификатор постоянно, до тех пор, пока узел не будет удален?

1 Ответ

0 голосов
/ 26 февраля 2019

Схема GitHub GraphQL является Реле-совместимой .С их домашней страницы:

Relay - это инфраструктура JavaScript для создания управляемых данными приложений React на основе GraphQL, разработанная с нуля, чтобы быть простой в использовании, расширяемой и, прежде всего, производительной.

Хотя Relay является клиентом внешнего интерфейса, он требует, чтобы схемы включали в себя определенные функции, чтобы клиент мог работать должным образом.Одной из этих функций является Глобальная идентификация объекта .Как вы предоставляете уникальный глобальный идентификатор, остается на усмотрение сервера.Однако Relay предоставляет вспомогательную библиотеку на стороне сервера, которая имеет встроенный механизм:

export function toGlobalId(type: string, id: string): string {
  return base64([type, id].join(':'));
}

export function fromGlobalId(globalId: string): ResolvedGlobalId {
  const unbasedGlobalId = unbase64(globalId);
  const delimiterPos = unbasedGlobalId.indexOf(':');
  return {
    type: unbasedGlobalId.substring(0, delimiterPos),
    id: unbasedGlobalId.substring(delimiterPos + 1),
  };
}

Все, что это делает, - это объединение идентификатора и типа GraphQL, а затем кодирование его с использованием Base64.Пока вы не возвращаете строки из разных таблиц одного и того же типа, это гарантированно будет уникальным.

Так работает API GitHub.Однако не все API-интерфейсы GraphQL совместимы с Relay.Таким образом, есть и преимущества, и затраты на разработку схемы.Чтобы ответить на ваш вопрос более прямо, то, как поле разрешается, полностью зависит от сервера.Средство распознавания, которое вы пишете для определенного поля (включая мутации корневого уровня), передается в виде пары частей информации:

  • значение, которое родительское поле разрешило в
  • аргументы дляполе

Большинство реализаций также предоставляют некоторый объект context и объект info, который описывает сам запрос GraphQL, хотя это не является строго частью спецификации.Дело в том, что это все, что распознаватель действительно «знает».Однако, поскольку вы пишете распознаватель, вы знаете, какие данные необходимо запрашивать или обрабатывать, исходя из поля, для которого вы пишете преобразователь.

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