【问题标题】:What restrictions has cursor in GraphQL Connections for Relay?GraphQL Connections for Relay 中的光标有哪些限制?
【发布时间】:2016-11-17 02:41:55
【问题描述】:

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

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

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

1) 光标在不同类型之间应该是唯一的吗?

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

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

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

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

【问题讨论】:

    标签: connection graphql relay


    【解决方案1】:

    1) 光标在不同类型之间应该是唯一的吗?

    如果您的问题是“游标应该是全局唯一的”,那么答案是否定的。它们不像 ID,ID 在 Relay 中必须是全局唯一的,以便于重新获取(用于区分)。光标可以像“100”或“101”这样简单,尽管在实践中通常包含比这更具描述性和/或结构化的内容。

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

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

    这是一个特定于实现的事情。光标的指向是启用分页,其内容是任意的。简单地说,它应该包含足够的信息,连同连接上的其他参数,以使服务器上的 GraphQL 模式能够确定它应该为下一个 (after) 或上一个 (before) 返回什么页面。

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

    我不确定它是否会,但你可以试试看。即使它没有抛出错误,它也可能没有意义。游标的目的是让你指定一个分页的相对起点,所以如果游标“x”出现在连接中的两个不同位置,“x 之后的前 10”是什么意思?

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

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

    【讨论】:

    • 免责声明:我在 Relay 上工作,而不是 GraphQL,但我已经尽我所能回答了这些问题。
    • 非常感谢。您的免责声明是我的要求;)我需要 Relay 团队的回答,即您在 Relay 中没有对 cursors 进行特定操作。所以github.com/nodkz/graphql-compose-connection 已准备好投入生产。
    • 嗨@wincent,当你说光标应该是简单的东西,比如 100 或 101;那将如何产生。我想知道的是,例如,如果您的 BE 与数据库对话(为了论证的缘故,假设为 MySQL),那么像 100 或 101 这样的游标将如何转换为数据库中的某个位置(这是我能看到的唯一方法可能是通过使用 ID 字段?)