【问题标题】:Viewer in Relay.jsRelay.js 中的查看器
【发布时间】:2016-09-19 01:26:59
【问题描述】:

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

过去一周我一直在尝试了解 Relay.js。我现在对 GraphQL 很好,而且我非常了解它,但是我在将 GraphQL 和 Relay.js 结合在同一个应用程序中时遇到了一些问题。

第一步可能是了解viewer。我看过很多使用它的示例和教程,但从来没有解释过,也不是很清楚它到底是什么以及它的用途。

Relay 文档多次提到 viewer,但没有一个词解释它。

我希望我能对这个问题做更多的事情,但恐怕网上没有解释。它仅用于代码中,将其脱离上下文没有任何意义。无论如何,回答这个问题需要一些关于 Realy.js/GraphQL 的知识。

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

【问题讨论】:

    标签: graphql relayjs


    【解决方案1】:

    viewer 不是 Relay 特有的。这只是一个字段名称。你是对的。该字段通常代表应用程序的用户或查看者的 GraphQLObject 类型。

    根查询类型是我们在模式对象中定义并作为query 传递的GraphQL 对象。例如,在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 以说明如何在服务器端进行用户访问检查。

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 2022-07-06
      • 2016-05-21
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2020-12-24
      • 2017-11-15
      相关资源
      最近更新 更多