【问题标题】:Pagination in NodeJS API [duplicate]NodeJS API中的分页[重复]
【发布时间】:2021-03-18 10:09:46
【问题描述】:

如何在 NodeJS API 中进行分页。我这里有包含 Post.Find().populate 东西的代码,我不确定在代码的哪个点我可以使用限制和偏移量进行分页。顺便说一句,如果我想做一个无限滚动,我应该使用限制/偏移还是限制/跳过?非常感谢任何帮助,并在此先感谢您。

router.get('/allpost',JWTAuthenticatToken, async (req, res) => {  
    try{
        const post = await Post.find().populate("postedby","_id displayname profileimage").populate("reviewers.postedby","_id displayname")
        res.json(post)
    }catch(error){
        res.json({message:error})
    }
})

【问题讨论】:

标签: node.js mongodb


【解决方案1】:

对于分页,您需要两件事的值 1.current_page_no 2.item_per_page

然后你可以这样编码,

router.get('/allpost',JWTAuthenticatToken, async (req, res) => {  
    try{
        const post = await Post.find().populate("postedby","_id displayname profileimage").populate("reviewers.postedby","_id displayname").skip((item_per_page * current_page_no)-item_per_page)).limit(item_per_page)

        res.json(post)
    }catch(error){
        res.json({message:error})
    }
})

【讨论】:

  • 谢谢。实现它的另一种方法
【解决方案2】:

对于分页,您将始终需要发送当前页面。您可以将其作为查询字符串、参数或只是 POST 变量发送。

router.get('/allpost',JWTAuthenticatToken, async (req, res) => {  
    try{
        let page = req.body.page ?? 1;
        let limit = 10;
        const post = await Post.find().populate("postedby","_id displayname profileimage").populate("reviewers.postedby","_id displayname").skip((page * limit) - limit).limit(limit)
        res.json(post)
    }catch(error){
        res.json({message:error})
    }
})

我通过 POST 发送到这里。

您在此处所做的操作设置了您希望显示的最大数量的限制。然后你需要一些基本的计算。 在第一页你想跳过 0,在第 2 页你想跳过 10 在第 3 页你想跳过 20 等等......

10 * 1 = 跳过 10。这意味着在第 1 页您将跳过 10。但您想跳过 0。为此,您需要减去 10。

【讨论】:

  • 谢谢。我使用 post 而不是 get 因为 Axios 不支持 req.body。
  • @Nat 好吧,那句话实际上没有意义,因为 POST 变量在请求正文 req.body 中。在这个例子中,我使用了 POST 而不是 GET
  • 哈哈哈。是的,确实,我重读了它,我也觉得很奇怪。谢谢
【解决方案3】:

我可以与您分享我的实现是如何使用 ExpressJS 和 MySQL 数据库的。背后的想法是:

  1. 确定您希望从数据库中显示的数据的numberOfRows
  2. 设置pageSize以显示单页显示的项目数。
  3. 始终使用 req.query 返回当前视图的 page 编号,否则默认为第 1 页。
  4. 使用返回的page,我们可以计算出数据的行数为skip
  5. 最后,在您的查询中设置limit(offset, length)

编码部分将是:

var connection;
var pageSize = 20;
var numberOfRows, numberOfPages;
var numberPerPage = parseInt(pageSize,10) || 1;
var page = parseInt(pageInfo.page, 10) || 1;
var skip = (page - 1) * numberPerPage;
var limit = `${skip} , ${numberPerPage}`;

return connectionPool.getConnection()
.then((connect) => {
  connection = connect;
  return connection.query(`SELECT COUNT(*) AS total ....`); //To get total rows
})
.then(([rows, field]) => {
  numberOfRows = rows[0].total;
  numberOfPages = Math.ceil(numberOfRows / numberPerPage);
  return connection.query(`SELECT .... LIMIT ${limit}`); //Get specific data with LIMIT
})
.then(([rows, field]) => {
  result = {
    rows: rows,
    pagination: {
    current: page,
    numberPerPage: numberPerPage,
    has_previous: page > 1,
    previous: page - 1,
    has_next: page < numberOfPages,
    next: page + 1,
    last_page: Math.ceil(numberOfRows / pageSize)
    }
  }
  return result;
})
.catch((err) => {
  throw new Error(err.message);
})
.finally(() => {
  connection.release();
})

这是一个可行的代码,您只需在前端的分页中正确组织您返回的result。虽然是使用 MySQL 完成的,但希望你能理解背后的概念。

【讨论】:

  • 感谢并非常感谢
猜你喜欢
  • 2018-06-30
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2020-08-03
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多