RANGE_ADD
突变需要一个,edgeName
以便它可以将新边缘插入客户端连接。作为其查询的一部分,它还包括cursor
.
问题是服务器无法知道客户端在生成边缘响应时可能会将哪些参数应用于连接。
这是否意味着cursor
应该是稳定的?
通常,当连接与不同的参数一起使用时,游标不需要相同。例如,如果我这样做:
{
namedFriends: friends(orderby:NAME first:5) {
edges { cursor, node { id } }
}
favoriteFriends: friends(orderby:FAVORITE first:5) {
edges { cursor, node { id } }
}
}
可能会使用不同的后端来为这两个连接提供服务,因为这两个排序可能有不同的后端;因此,同一朋友的游标可能不同,因为它们可能需要为不同的后端编码不同的信息。
但是,这使得执行突变时变得很棘手:
mutation M {
addFriend($input) {
newFriendsEdge {
{ cursor, node { id } } // Which cursor is this?
}
}
}
在这种情况下,突变将从连接返回一条边,该字段接受与连接相同的非分页参数很有用。所以在上述情况下,我们会这样做:
mutation M {
addFriend($input) {
newNamedFriendsEdge: newFriendsEdge(orderby:NAME) {
{ cursor, node { id } } // Cursor for namedFriends
}
newFavoriteFriendsEdge: newFriendsEdge(orderby:FAVORITE) {
{ cursor, node { id } } // Cursor for favoriteFriends
}
}
}
理想情况下,实现newFriendsEdge(orderby:FAVORITE)
和favoriteFriends: friends(orderby:FAVORITE first:5)
共享通用代码以生成游标。
请注意,虽然游标不需要相同,但它们可以作为服务器的实现细节。通常,光标只是节点的 ID,这是发生这种情况的常见方式。在实践中,在这些情况下,如果连接上的参数不影响光标,我们会从突变的边缘字段中省略它;所以如果orderby
不影响光标,那么:
mutation M {
addFriend($input) {
newFriendsEdge {
{ cursor, node { id } } // orderby didn't exist on newFriendsEdge, so this cursor must apply to both.
}
}
}
这是我们突变的常见模式。如果您遇到任何问题,请告诉我;我们在开发突变返回边缘的模式时考虑了“参数更改光标”的情况,以确保有可能的解决方案(这是我们提出边缘字段想法的参数时),但它没有在实践中出现了这么多,所以如果你遇到棘手的问题一定要告诉我,我们可以而且应该重新审视这些假设/要求!