Relay 中的 nodeInterface、nodeField 和 nodeDefinitions 是什么?

gpb*_*lio 5 relayjs

我目前正在做 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;
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

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

And*_*ram 4

如果您正在编写没有 Relay 的 GraphQL 服务器,则需要在查询类型上定义多个入口点,例如:

type Query {
  picture(id: Int!): Picture
  user(id: Int!): User
  ...etc
}
Run Code Online (Sandbox Code Playgroud)

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

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

type Query {
  picture(id: Int!): Picture
  user(id: Int!): User
  ...etc
  node(id: ID!): Node
}
Run Code Online (Sandbox Code Playgroud)

现在对于nodeDefinitions. 本质上这个函数让我们定义两件事:

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

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

query Test {
  node(id: 'something') {
     ...fragment on Picture {
       url
     }
     ...fragment on User {
       username
     }
  }
}
Run Code Online (Sandbox Code Playgroud)