我必须构建和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页(作为下一页)没有任何反应......
我猜我必须实现类似下一个的东西,但我不知道该怎么做
任何帮助将不胜感激......
答案 0 :(得分:7)
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));
答案 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);
});