【问题标题】:How to correctly get paginated results in Sequelize using offset?如何使用偏移量在 Sequelize 中正确获得分页结果?
【发布时间】:2020-01-10 10:59:32
【问题描述】:

我有以下简单的代码:

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,这是我在第一个查询中已经收到的。

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

【问题讨论】:

    标签: javascript postgresql typescript pagination sequelize.js


    【解决方案1】:

    我想我在玩了最后 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)
            }),
        ),
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2017-12-26
      相关资源
      最近更新 更多