GraphQL Connections for Relay 中的游标有哪些限制?

What restrictions has cursor in GraphQL Connections for Relay?

我几乎完成了 NodeJS https://github.com/nodkz/graphql-compose-connection 的包,它允许为使用 graphql-compose 构建的 graphql 类型构建连接类型。

此包完全遵循中继游标连接规范 (https://facebook.github.io/relay/graphql/connections.htm),并增加了很多内容:filter arg(用于过滤记录)和 sort arg(用于按唯一索引对记录进行排序) ).

所以我有以下关于游标唯一性的问题:

1)游标在不同类型中应该是唯一的吗?

2) 游标在具有不同参数的一个连接中应该是唯一的吗?

例如。在 UserConnection 中我有过滤器参数。我想在第一个列表中显示所有用户,在第二个列表中显示在线用户(页面上同时显示 2 个列表)。两个列表中可能存在一个具有相同光标的用户。

3)如果Relay在一个连接中得到相似的游标,会不会报错?

4)游标应该是base64编码的,还是可能包含字符串化的json对象?

1)游标在不同类型中是否应该是唯一的?

如果您的问题是"should cursors be globally unique",答案是否定的。它们不像 ID,后者在 Relay 中必须是全局唯一的,以便于重新获取(用于比较)。游标可以像“100”或“101”一样简单,尽管实际上通常包含比这更具描述性的and/or结构。

2) 游标在具有不同参数的一个连接中应该是唯一的吗?

Eg. in UserConnection I have filter arg. And I want display all users in first list and online users in the second (2 lists simultaneously on the page). One user with same cursor may be exists in both list.

这是特定于实现的事情。游标的要点是可以分页,其内容是任意的。简单地说,它应该包含足够的信息,连同连接上的其他参数,使服务器上的 GraphQL 模式能够确定它应该 return 用于下一个 (after) 或前 (before) 页。

3) 如果Relay在一个连接中得到相似的游标,会不会报错?

我不确定它是否会,但你可以试试看。即使它没有抛出错误,它也可能没有意义。游标的作用是让你指定一个分页的相对起点,所以如果游标"x"出现在一个连接的两个不同的地方,"first 10 after x"是什么意思?

4)游标应该是base64编码的,还是可能包含字符串化的json对象?

Base64 是我们按照惯例所做的事情,而不是因为它是强制性的,以便更清楚地表明游标应被视为不透明的标记,不应依赖其内部结构。它们是特定于实现的。所以,我相信您可以根据需要使用 JSON 字符串,但使用 Base64 对其进行编码有一些好处。