首页 > 解决方案 > 使用过滤器参数和排序时如何在 GraphQL / Relay 中使用(不透明)游标

问题描述

想象一下以下 GraphQL 请求:

{
  books(
    first:10,
    filter: [{field: TITLE, contains: "Potter"}],
    orderBy: [{sort: PRICE, direction: DESC}, {sort: TITLE}]
  )
}

结果将返回一个带有 Relay 游标信息的连接。

光标是否应该包含filterorderBy细节?

这意味着查询下一组数据仅意味着:

{
  books(first:10, after:"opaque-cursor")
}

还是应该重复filterand ?orderBy

在后一种情况下,用户可以指定会使不透明光标无效的不同filter和/或细节。orderBy

我在 Relay 规范中找不到任何关于此的内容。

标签: graphqlrelayjsrelay

解决方案


我已经看到这样做有多种方式,但我发现使用基于光标的分页,您的光标仅存在于您的数据集中,并且更改过滤器会更改数据集,使其无效。

如果您使用的是 SQL(或没有基于游标的分页),那么您需要在游标中包含足够的信息才能恢复它。您的光标需要包含您的所有过滤器/订单信息,并且您需要禁止任何额外的过滤器。

如果他们与“filter / orderBy”一起发送“after”,您将不得不抛出错误。您可以选择检查参数是否与光标中的参数相同,以防出现用户错误,但根本没有用例来获取不同数据集的“第 2 页”。


推荐阅读