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


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?和HidingSpot是GraphQLSchema上的名称吗?这是什么'const {type,id} = fromGlobalId(globalId);'做?还有第二个论点是什么?我需要了解nodeDefinitions的帮助,以某种方式我无法在官方文档中找到nodeDefinitions。谢谢你。

最佳答案

如果要编写不带中继的GraphQL服务器,则需要在查询类型上定义许多入口点,例如:

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

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

有时您可能只希望重新查询的一部分,也许是在对连接进行分页,或者您进行了变异。 Relay的Node接口(interface)的作用是为您提供一种标准的方式,以通过全局唯一ID来获取实现该类型的任何类型。中继能够识别其查询中的此类节点,并在可能的情况下使用它们以使重新获取和分页更加有效。我们将节点类型添加到根查询类型:
type Query {
  picture(id: Int!): Picture
  user(id: Int!): User
  ...etc
  node(id: ID!): Node
}

现在是nodeDefinitions。本质上,此函数使我们可以定义两件事:
  • 如何根据给定的globalId返回对象。
  • 如何返回给定对象的类型。

  • 第一个用于获取节点字段的ID参数,并使用它来解析对象。第二个选项使您的GraphQL服务器可以计算出返回的对象类型-这对于使我们能够在查询节点时定义特定类型的片段非常必要,这样我们才能实际获取所需的数据。没有这个,我们将无法成功执行如下查询:
    query Test {
      node(id: 'something') {
         ...fragment on Picture {
           url
         }
         ...fragment on User {
           username
         }
      }
    }
    

    关于relayjs - 什么是中继中的nodeInterface,nodeField和nodeDefinitions?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42576581/

    10-09 20:37