节点分页与快递

时间:2017-12-13 18:54:22

标签: javascript json node.js

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

  • 查询参数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页(作为下一页)没有任何反应......

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

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

5 个答案:

答案 0 :(得分:7)

在我抓了两天头后,我发现了一个适合我的解决方案。谢谢你 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)
  });
});

答案 1 :(得分:3)

检查出来:

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
  });
});

P.S。如果从数据库中检索posts数组 - 我强烈建议使用数据库权限来检索必要的数据。否则,检索数千个页面然后将数组切割为10个项目将导致性能问题。

答案 2 :(得分:1)

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

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/

答案 3 :(得分:1)

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 :(得分:0)

带有分页的节点分页
客户端需要提供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); });