如何使用Hapi JS和MYSQL构建分页API

时间:2017-12-17 09:43:26

标签: hapijs

我想使用HAPI JS和MYSQL使用限制和偏移参数

开发API

有人可以建议我如何开发这个资源。

感谢。

示例:GET /学校?offset = 10& limit = 20

1 个答案:

答案 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);