我目前正在做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
。本质上,此函数使我们可以定义两件事:第一个用于获取节点字段的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/