【问题标题】:Node pagination with express使用 express 进行节点分页
【发布时间】:2018-05-27 18:27:37
【问题描述】:

我必须构建 API 作为服务器端,它应该在 10 个条目的页面中提供结果,只使用带有 express 的 Node(没有其他包)。

  • 查询参数p指定返回哪个页面,从1开始。如果省略p参数,则默认值为1。
  • 如果客户端要求/api/stories?p=1,他们应该只得到10个故事,从最新的开始。

  • 如果是p=2,API 必须返回第二批 10 个故事。 当返回一页故事时,必须先按最近的故事排序。

  • 如果p 大于最后一个页码,API 必须返回最后一个可用页。

  • page 值是当前返回的页面。如果请求的页面p大于最后一个页码,返回的page值将表示最后一个页码。

  • pageCount 值是最后一个非空页的编号。*

这就是我的分页...

//pagination
const pageLimit = 10;
app.get('/api/posts', function(req, res) {
  res.json({
    "posts": posts.slice(-pageLimit).reverse(),
    "page": 1,
    "pageCount": Math.ceil(posts.length / 10)
  });
});

返回是正确的,因为每页有 10 个帖子,第 11、21、31 个帖子被推送到第 2、第 3 页等... 现在我的问题来了,当我尝试从第 1 页前进到第 2 页(作为下一页)时,什么也没有发生......

我猜我必须实现类似下一个的东西,但我不知道该怎么做

任何帮助将不胜感激......

【问题讨论】:

    标签: javascript json node.js


    【解决方案1】:

    在摸索 2 天后,我找到了一个适合我的解决方案。感谢 num8er 为我指明正确的方向...

    app.get('/api/posts', (req, res) => {
      const pageCount = Math.ceil(posts.length / 10);
      let page = parseInt(req.query.p);
      if (!page) { page = 1;}
      if (page > pageCount) {
        page = pageCount
      }
      res.json({
        "page": page,
        "pageCount": pageCount,
        "posts": posts.slice(page * 10 - 10, page * 10)
      });
    });
    

    【讨论】:

    • 点赞!既然你要返回 json 响应,我不得不问一个问题,如果这个人更改了 url 中的数据并按回车键,你如何防止他们在屏幕上看到原始 json
    • 我遇到的最简单的方法!
    • 需要修改以处理posts.length === 0,如果先过滤可能会发生这种情况
    • 帖子的价值是什么?你从哪里得到或定义?
    【解决方案2】:

    看看这个:

    app.get('/api/posts', (req, res) => {
      const postCount = posts.length;
      const perPage = 10;
      const pageCount = Math.ceil(postCount / perPage);
    
      let page = parseInt(req.query.p);
      if(page < 1) page = 1;
      if(page > pageCount) page = pageCount;
    
      const from = postCount - ((page - 1) * perPage) - 1; // ex.: 44 - ((1 - 1) * 10) -1 = 43 (44 is count, 43 is index)
      let to = postCount - (page * perPage); // ex.: 44 - (1 * 10) = 34
      if(to < 0) to = 0;
    
      res.json({
        posts: posts.slice(from, to).reverse(),
        page,
        pageCount
      });
    });
    

    附:如果从数据库中检索到 posts 数组 - 我强烈建议使用数据库功能来检索必要的数据。否则检索数千页然后将数组切片为 10 项将导致性能问题。

    【讨论】:

    • no 只是内存中的测试文件。不涉及分贝……您的解决方案几乎就是我所需要的。试着弄清楚如何调整,因为会出现一些错误,如“ReferenceError: pages is not defined”。
    • @Gallex 已修复,我的错
    • @Gallex 已根据帖子的正确大小进行了修复,以免超出范围
    【解决方案3】:
    export default (limit, offset, count) => {
      const pageData = {};
      limit = limit > count ? count : limit;
      offset = offset > count ? count : offset;
    
      pageData.page = Math.floor(offset / limit) + 1;
      pageData.pageCount = Math.ceil(count / limit);
      pageData.pageSize = Number(limit);
      pageData.totalCount = count;
    
      return pageData;
    };
    

    【讨论】:

      【解决方案4】:

      你快到了。你错过了一部分,这是一个实际的例子:

      let records = [
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
      ];
      let pageSize = 5;
      
      function paginate(page = 1) {
          //when page is 1, we go from index 0 to index 4 
          //that's the first 5 records.
          return records.slice(pageSize * (page - 1), pageSize * page);
      }
      
      console.log(paginate(1));
      console.log(paginate(2));
      console.log(paginate(3));
      

      https://jsfiddle.net/fe4s2qxv/

      【讨论】:

        【解决方案5】:

        节点分页带sequelize
        客户端需要提供page和pageSize

        const page = 1
        const pageSize = 2
        const offset = page * pageSize
        const limit = offset + pageSize
        return model.findAll({
                     attributes: [],
                     include: [{}],
                     limit,
                     offset
               })
               .then((tasks) => res.status(200).send(tasks))
               .catch((error) => {
                     console.log(error);
                     res.status(400).send(error);
               });
        

        【讨论】:

          猜你喜欢
          • 2021-06-24
          • 1970-01-01
          • 2018-08-05
          • 2017-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          相关资源
          最近更新 更多