什么是继电器中的nodeInterface,nodeField和nodeDefinitions?

时间:2017-03-03 10:35:09

标签: 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;
    }
  }
);

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

2 个答案:

答案 0 :(得分:3)

如果你在编写没有Relay的GraphQL服务器,你可以在Query类型上定义一些入口点,例如:

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

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

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

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

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

  1. 如何返回给定globalId的对象。
  2. 如何返回给定对象的类型。
  3. 第一个用于获取节点字段的ID参数,并使用它来解析对象。第二个允许您的GraphQL服务器确定返回了哪种类型的对象 - 这是必要的,以便我们能够在查询节点时定义特定类型的片段,以便我们实际上可以获得我们想要的数据。没有这个,我们就无法成功执行如下的查询:

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

答案 1 :(得分:1)

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

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

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

第一个参数接收globalId,我们将globalId映射到其对应的数据对象。并且globalId实际上可以用于使用fromGlobalId函数读取对象的类型。

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

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