[英]How to correctly get paginated results in Sequelize using offset?
I have the following simple piece of code: 我有以下简单的代码:
const users = await User.findAll({
limit: 10,
offset: (page - 1) * 10,
order: [['createdAt', 'DESC']],
where: { isAdmin: false },
})
I expect this code to return a paginated user result based on the page
. 我希望这段代码能根据page
返回分页的用户结果。 For example, for page = 1
I expect to get the first 10 users, and for page = 2
I expect to get the next 10 users. 例如,对于page = 1
我希望获得前10个用户,对于page = 2
我希望获得接下来的10个用户。
In my tests, I'm using bulkCreate
to create users: 在测试中,我正在使用bulkCreate
创建用户:
await models.User.bulkCreate(
Array.from({ length: 25 }).map((_, i) => ({
email: `user-${i}@test.com`,
name: 'test',
password: 'password1',
})),
)
I then make a query with page = 1
, which works as expected - it returns to me user-0@test.com
up to user-9@test.com
. 然后,我用page = 1
进行查询,该查询按预期方式工作-它返回给我user-0@test.com
直至user-9@test.com
。
However, when I make a query with page = 2
, it returns user-9
up to user-18
. 但是,当我用page = 2
进行查询时,它将返回user-9
到user-18
。 I expect to get user-10
up to user-19
, but instead I get user-9
which I've already received in my first query. 我希望将user-10
提升到user-19
,但是我会在第一个查询中收到user-9
。
What am I doing wrong here? 我在这里做错了什么? Thanks in advance. 提前致谢。
I think I figured out the problem after playing around with it for the last 40 minutes. 我想我在解决了最后40分钟后就发现了问题。
I looked at my Users table and realized that bulkCreate
actually creates all of them at the exact same time (which makes sense). 我查看了我的Users表,意识到bulkCreate
实际上是在完全相同的时间创建了所有它们(这很有意义)。 That means their createdAt
was exactly the same, so my results were not really sorted reliably. 这意味着它们的createdAt
完全相同,因此我的结果并不是真正可靠地排序。
I opted to not use bulkCreate, and instead add a small delay before creating each user, using this somewhat sloppy implementation: 我选择不使用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)
}),
),
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.