我目前正在做 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。谢谢你。
如果您正在编写没有 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. 本质上这个函数让我们定义两件事:
第一个用于获取节点字段的 ID 参数并使用它来解析对象。第二个允许 GraphQL 服务器计算出返回的对象类型 - 这是必要的,以便我们能够在查询节点时定义特定类型的片段,以便我们能够真正获得我们想要的数据。如果没有这个,我们就无法成功执行如下查询:
query Test {
node(id: 'something') {
...fragment on Picture {
url
}
...fragment on User {
username
}
}
}
Run Code Online (Sandbox Code Playgroud)