Просмотр в Relay.js

Зачем вам и как правильно использовать viewer в Relay.js?

Я провел прошлую неделю, чтобы попытаться понять Relay.js. Im теперь хорошо работает с GraphQL, и я понимаю это довольно хорошо, но у меня есть некоторые проблемы с объединением GraphQL и Relay.js в том же приложении.

Первым шагом, вероятно, будет понимание viewer. Я видел много примеров и руководств, которые он использовал, но он никогда не объяснял, и не совсем понятно, что это точно и для чего он используется.

Документация на реле упоминает viewer несколько раз, но нет ни одного слова, объясняющего это.

Хотелось бы, чтобы я мог что-то сделать с этим вопросом, но я не боюсь там никаких объяснений в Интернете. Он используется только в кодах и вырывает его из контекста, не имеет никакого смысла. Отвечая на этот вопрос, в любом случае потребуются некоторые знания о Realy.js/GraphQL.

Мое лучшее предположение, основанное на бесчисленных примерах, которые я исследовал, заключается в том, что это как-то связано с пользователем? Если пользователь анонимный или вошел в систему? Предоставлять различный доступ к данным на основе состояния входа или уровня пользователя?

Ответ 1

viewer не является специфичным для реле. Это просто название поля. Вы rihgt. Это поле обычно представляет собой тип GraphQLObject для пользователя или зрителя приложения.

Тип запроса root - это объект GraphQL, который мы определяем и передаем как query в объекте схемы. Например, в пример приложения todo, он Root.

export const schema = new GraphQLSchema({
  query: Root,
  mutation: Mutation,
});

В приложение-приложение-приложение treasurehunt, тип запроса root queryType.

export const schema = new GraphQLSchema({
  query: queryType,
  mutation: mutationType,
});

Тип запроса root - это основная точка доступа, к которой осуществляется доступ к другим данным. Эти другие данные перечислены как поля корневого объекта запроса. Как и любой объект GraphQL, тип запроса root может иметь одно или несколько полей. В приложении примера todo у него есть одно поле с именем viewer:

const Root = new GraphQLObjectType({
  name: 'Root',
  fields: {
    viewer: {
      type: GraphQLUser,
      resolve: () => getViewer(),
    },
    node: nodeField,
  },
});

В приложении примера relay-treasurehunt корневой тип запроса имеет одно поле с именем game.

const queryType = new GraphQLObjectType({
  name: 'Query',
  fields: () => ({
    node: nodeField,
    game: {
      type: gameType,
      resolve: () => getGame(),
    },
  }),
});

Теперь, если для представления пользователя приложения или веб-сайта существует поле viewer, независимо от того, является ли пользователь анонимным или зарегистрировано полностью, зависит от приложения. Если пользователю необходимо войти в систему, вы можете реализовать мутацию для входа. Вы также можете ограничить доступ к данным. Jonas Helfer опубликовал отличный ответ о том, как можно проверить доступ пользователей серверная сторона.