我想使用HAPI JS和MYSQL使用限制和偏移参数
开发API有人可以建议我如何开发这个资源。
感谢。
示例:GET /学校?offset = 10& limit = 20
答案 0 :(得分:1)
分页取决于非常基本的原则。 首先,您需要知道一个特定的查询,您将在页面中显示,您有多少行?
例如,您在自己的页面上列出博客帖子,获取总行数
SELECT count(*) FROM blog_post_table; // cosnt numRows = Query....,
我们说它是 168 ;
现在,您需要确定页面中显示的行数。在您的示例中,有一个查询参数“limit = 20”来回答我们的问题。
const perPage = request.query.limit || 20;
根据查询字符串中的limit参数或每页至少20个项目,验证是您的作业,Joi。
然后,我们应该根据我们的perPage信息计算出那些页面。
const totalPages = Match.ceil(numRows / perPage);
结果为9,我们使用 Math.ceil ,你得到它我假设,你不能将168除以20,因为剩下8项。结果是8.4,意味着我们还需要一个页面来显示剩余的8个项目。
到目前为止一切顺利,现在我们必须计算偏移量,从读数据开始。当然,在第一页中,它从0开始,但是第二或第四或第九?
现在我们需要一个当前页面参数,我们应该在查询字符串中携带这些信息(我故意丢弃了你的offset = 10定义),假设在查询字符串中有一个名为page的参数
const currentPage = request.query.page || 1; // easy, yet harmful, it need validation
现在我们知道当前的页面,现在我们可以根据这些数字来计算我们的限制。
const offset = perPage * (currentPage - 1);
要实现,将数字放在地方
const offset = 20 * (1-1); // page 1 offset = 0;
const offset = 20 * (2-1); // page 2 offset = 20;
.
.
.
const offset = 20 * (9-1); // page 9 offset = 160;
现在我们可以根据我们的计算进行主查询。
const sql = `SELECT * FROM blog_post_table LIMIT ${perPage} OFFSET ${offset}`;
获取行并发送到您的页面。如果要显示正确的分页界面,一些其他信息将非常有用。
假设您的回复数据是这样的;
const response = {
'results': ['array of elements from db'],
'currentPage': currentPage, // learn object literals, it unnecessary,
'nextPage': currentPage + 1, // don't be that naive, validate this,
'lastPage': totalPages, // it is obvious
'previousPage': currentPage - 1, // what if we're in the very first page, then we can go to 0, validate!
}
<强>奖金:强> 生成上一页和下一页的小代码,不是一个完美的解决方案,只是很快就能实现。
const getOtherPages = (totalPages, currentPage) => {
previousPage = null
nextPage = null
if currentPage > totalPages or currentPage < 1:
return previousPage, nextPage
if currentPage > 1:
previousPage = currentPage - 1
if (currentPage + 1) < totalPages:
nextPage = currentPage + 1
return [previousPage, nextPage]
}
// Usage
const [previousePage, nextPage] = getOtherPages(totalPages, currentPage);