Relay.js中的查看器

时间:2016-05-22 00:34:49

标签: graphql relayjs

为什么需要以及如何在Relay.js中正确使用viewer

我过去一周试图了解Relay.js。我现在对GraphQL很好,我理解得很好,但我在同一个应用程序中将GraphQL和Relay.js联合起来有一些问题。

第一步可能是了解viewer。我已经看过许多使用它的示例和教程,但它从未被解释过,它的确切内容和用途是什么并不十分清楚。

接力文档提及viewer几次,但是没有一个单词可以解释它。

我希望我能为这个问题做点什么,但我担心网上没有解释。它只在代码中使用,并且脱离上下文没有任何意义。回答这个问题需要一些关于Realy.js / GraphQL的知识。

根据我检查的无数个例子,我最好的猜测是它与用户有某种关系?如果用户是匿名或登录?根据登录状态或用户级别授予对数据的不同访问权限?

1 个答案:

答案 0 :(得分:8)

viewer不是特定于接力的东西。这只是一个字段名称。你真是太好了。该字段通常表示应用程序的用户或查看器的GraphQLObject类型。

根查询类型是我们定义的GraphQL对象,并在架构对象中作为query传递。例如,在todo example application中,它是Root

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

relay-treasurehunt example application中,根查询类型为queryType

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

根查询类型是访问其他数据的主要访问点。这些其他数据列为根查询对象的字段。与任何GraphQL对象一样,根查询类型可以包含一个或多个字段。在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在服务器端发布了excellent answer如何进行用户访问检查。