如何使用偏移量在续集中正确获得分页结果?



我有以下简单的代码段:

const users = await User.findAll({
limit: 10,
offset: (page - 1) * 10,
order: [['createdAt', 'DESC']],
where: { isAdmin: false },
})

我希望这段代码能根据page返回分页的用户结果。例如,对于page = 1,我希望获得前 10 个用户,对于page = 2,我希望获得接下来的 10 个用户。

在我的测试中,我使用bulkCreate来创建用户:

await models.User.bulkCreate(
Array.from({ length: 25 }).map((_, i) => ({
email: `user-${i}@test.com`,
name: 'test',
password: 'password1',
})),
)

然后我使用page = 1进行查询,它按预期工作 - 它返回给我user-0@test.com最多user-9@test.com.

但是,当我使用page = 2进行查询时,它最多返回user-9user-18。我希望user-10达到user-19,但相反,我得到了我在第一次查询中已经收到的user-9

我在这里做错了什么?提前谢谢。

我想我在玩了最后 40 分钟后就想出了问题。

我查看了我的用户表,意识到bulkCreate实际上同时创建了所有这些(这是有道理的(。这意味着他们的createdAt完全相同,所以我的结果并没有真正可靠地排序。

我选择不使用bulkCreate,而是在创建每个用户之前添加一个小的延迟,使用这个有点草率的实现:

await Promise.all(
Array.from({ length: 25 }).map(
(_, i) =>
new Promise(resolve => {
setTimeout(async () => {
await User.create({
email: `user-${i}@test.com`,
name: 'test',
password: 'password1',
})
resolve()
}, i * 50)
}),
),
)

最新更新