我目前正在做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。谢谢。
答案 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
。从本质上讲,这个函数可以让我们定义两件事:
第一个用于获取节点字段的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等。
希望它能帮助你理解。我也在学习。