【问题标题】:How to build pagination API using Hapi JS and MYSQL如何使用 Hapi JS 和 MYSQL 构建分页 API
【发布时间】:2020-04-21 21:26:07
【问题描述】:

我想使用 HAPI JS 和 MYSQL 使用限制和偏移参数开发一个 API

任何人都可以向我推荐有关如何开发此功能的资源。

谢谢。

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

【问题讨论】:

    标签: hapijs


    【解决方案1】:

    分页依赖于非常基本的原则。 首先,您需要知道在您拥有的页面中显示的特定查询中,您有多少行?

    例如,您在页面上列出博客文章,获取总行数

    SELECT count(*) FROM blog_post_table; // cosnt numRows = Query...., 
    

    假设它是 168;

    现在,您需要决定一个页面中将显示多少行。在您的示例中,有一个查询参数“limit=20”可以回答我们的问题。

    const perPage = request.query.limit || 20; 
    

    基于查询字符串中的限制参数或每页至少 20 个项目,验证是你的功课,Joi。

    然后,我们应该根据我们的 perPage 信息来计算会有多少页。

    const totalPages = Match.ceil(numRows / perPage); 
    

    结果为 9,我们使用了 Math.ceil,你明白了,我假设你不能将 168 除以 20,因为还有 8 个剩余项目。结果 w 8.4,意味着我们需要多一页来显示剩余的 8 个项目。

    到目前为止一切顺利,现在我们必须计算我们的偏移量,我们从读取数据开始。第一页当然是从 0 开始,但是第二、第四、第九呢?

    现在我们需要一个当前页面参数,我们应该在查询字符串中携带此信息(我故意丢弃了您的 offset=10 定义),假设查询字符串中有一个名为 page 的参数

    const currentPage = request.query.page || 1; // easy, yet harmful, it needs 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多