简体   繁体   English

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

[英]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-9user-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM