我们要重建基于REST的服务后端应用程序,因为我们有很多,我们决定创新和尝试GraphQL服务嵌套的水平。
我们开始做简单的事情,该项目看起来非常有前途,但我们开始面临像分页现实世界的问题。在REST,分页方法是简单的,我们用GET方法与像pageSize
和pageNumber
一些参数(或offset
),我们建立SQL查询来执行此分页。
在GraphQL我们解决以下相同的方法问题,例如,具有此查询:
users(size:5 offset:2) {
id
name
}
这种方法看起来很容易实现,但更深的挖掘,我们发现,“最好”的模式来实现,这是一个连接,查询应该是这样的,其经过:
users(first:2) {
totalCount
edges {
node {
name
}
cursor
}
pageInfo {
endCursor
hasNextPage
}
}
我们的数据持久化在关系数据库中,因此我看不出光标是如何帮助(除非也许如果我使用自动增量ID?)。
这是为什么复杂的方法,推荐了一个简单的吗?而且还什么光标和endCursor将被存储?我误解我的学习之路的东西吗?
该Connection
规范最初是为继电器(Facebook的GraphQL客户端)创建的。后来开发了自己的生活,现在被认为是最好的做法,无论是客户端的。但是(这是一个巨大的,但),它最肯定不会很好地映射到每个用例。
如果你看到在实施Connection
分页样式值,你有两个选择:
1)治疗after
作为偏移(意味着数目将被传递),并且first
作为限制:
SELECT * FROM ORDER BY timestamp OFFSET $after LIMIT $first
同为before
和last
,只是不同的方向。
2)另一种方法是把after
/ before
作为排序列(所以实际的(混淆)值将被传递)的最后看到的值:
SELECT * FROM ORDER BY timestamp WHERE timestamp > $after LIMIT $first
也就是说,如果你不从Connection
方法中获益,随意忽略它。特别是如果你不使用,即使作为接力客户端。这是完全可选的事情,不应该被塞进它不属于。