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

Posted

技术标签:

【中文标题】GraphQL Connections for Relay 中的光标都有哪些限制?【英文标题】: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对象?

【问题讨论】:

【参考方案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 字段?)

以上是关于GraphQL Connections for Relay 中的光标都有哪些限制?的主要内容,如果未能解决你的问题,请参考以下文章

[Cisco] IOS NAT Load-Balancing for Two ISP Connections

listening for incoming tcp connections on 21025啥意思

Navicat for MySQL 中的 1040错误提示Too many connections的解决方法?

AWS AppSync - 使用 1-M @connections 和加入 @model 实现多对多连接

Dynamics CRM 流程错误 simultaneous connections limit reached for organization error occured

启动mongodb报错“about to fork child process, waiting until server is ready for connections.“