【问题标题】:What is nodeInterface, nodeField and nodeDefinitions in Relay?Relay中的nodeInterface、nodeField和nodeDefinitions是什么?
【发布时间】:2017-07-23 10:16:11
【问题描述】:

我目前正在做 facebook relayjs 教程,我需要帮助理解教程的这一部分,它指出

接下来,让我们定义一个节点接口和类型。我们只需要提供一个 Relay 从对象映射到关联的 GraphQL 类型的方式 使用该对象,并从全局 ID 到它指向的对象

const {nodeInterface, nodeField} = nodeDefinitions(
  (globalId) => {
    const {type, id} = fromGlobalId(globalId);
    if (type === 'Game') { 
      return getGame(id);
    } else if (type === 'HidingSpot') {
      return getHidingSpot(id);
    } else {
      return null;
    }
  },
  (obj) => {
    if (obj instanceof Game) {
      return gameType;
    } else if (obj instanceof HidingSpot) {
      return hidingSpotType;
    } else {
      return null;
    }
  }
);

在 nodeDefinition 的第一个参数上,它的 globalId 是从哪里得到的? Game 和 HidingSpot 是 GraphQLSchema 上的名称吗?这个 'const {type, id} = fromGlobalId(globalId);' 是什么意思做?还有什么是第二个论点?我需要帮助理解 nodeDefinitions,不知何故我在官方文档上找不到 nodeDefinitions。谢谢。

【问题讨论】:

    标签: relayjs


    【解决方案1】:

    Relay 使用全局对象识别,这意味着,在我的理解中,如果您的应用程序曾经尝试搜索对象。在您的示例中,尝试寻找游戏,或尝试寻找隐藏点。 Relay 将尝试在标准节点接口中获取对象。即通过 Game 的 {id: 123} 查找,或通过hidingSpot 的 {id:abc} 查找。如果您的架构(游戏、HidingSpot)没有设置节点接口,Relay 将无法获取对象。

    因此,如果您的应用程序需要在“游戏”中进行搜索,则需要在架构中定义节点接口。

    通过使用graphql-relay 帮助器,在您的应用程序中只使用一次nodeDefinitions 函数,基本上将全局定义的 Id 映射到实际的数据对象及其 GraphQL 类型。

    第一个参数接收 globalId,我们将 globalId 映射到其对应的数据对象中。而globalId其实可以通过fromGlobalId函数来读取对象的类型。

    第二个函数接收结果对象,Relay 使用它来将对象映射到它的 GraphQL 数据类型。所以如果对象是Game的一个实例,就会返回gameType等。

    希望它能帮助你理解。我也在学习中。

    【讨论】:

      【解决方案2】:

      如果您在没有 Relay 的情况下编写 GraphQL 服务器,您需要在 Query 类型上定义多个入口点,例如:

      type Query {
        picture(id: Int!): Picture
        user(id: Int!): User
        ...etc
      }
      

      因此,当您想要获取用户时,您可以轻松获取它,因为user 可用作图表的入口点。当你为你的页面/屏幕构建查询时,它通常会有几个级别的深度,你可能会去user -> followers -> pictures

      有时您希望能够仅重新获取部分查询,也许您正在通过连接进行分页,或者您已经运行了突变。 Relay 的 Node 接口的作用是为您提供一种标准方法来获取通过全局唯一 ID 实现它的 any 类型。 Relay 能够在其查询中识别此类节点,并在可能的情况下使用它们来提高重新获取和分页的效率。我们将节点类型添加到根查询类型中:

      type Query {
        picture(id: Int!): Picture
        user(id: Int!): User
        ...etc
        node(id: ID!): Node
      }
      

      现在为nodeDefinitions。本质上,这个函数让我们定义了两件事:

      1. 如何返回一个给定 globalId 的对象。
      2. 如何返回给定对象的类型。

      第一个用于获取节点字段的 ID 参数并使用它来解析对象。第二个允许您的 GraphQL 服务器计算返回的对象类型 - 这是必要的,以便我们能够在查询节点时定义特定类型的片段,以便我们可以实际获取我们想要的数据。没有这个,我们就无法成功执行这样的查询:

      query Test {
        node(id: 'something') {
           ...fragment on Picture {
             url
           }
           ...fragment on User {
             username
           }
        }
      }
      

      【讨论】:

      • 只是困惑,如何返回给定对象的类型。那么这里的 obj 是从哪里来的,又是什么时候创建的呢? globalId 显然来自 id 字段。
      猜你喜欢
      • 2017-06-13
      • 2017-11-12
      • 2017-08-12
      • 2017-08-31
      • 1970-01-01
      • 2016-04-29
      • 2017-10-15
      • 2017-04-05
      • 2018-02-12
      相关资源
      最近更新 更多