【发布时间】:2020-04-21 21:26:07
【问题描述】:
我想使用 HAPI JS 和 MYSQL 使用限制和偏移参数开发一个 API
任何人都可以向我推荐有关如何开发此功能的资源。
谢谢。
示例:GET /schools?offset=10&limit=20
【问题讨论】:
标签: hapijs
我想使用 HAPI JS 和 MYSQL 使用限制和偏移参数开发一个 API
任何人都可以向我推荐有关如何开发此功能的资源。
谢谢。
示例:GET /schools?offset=10&limit=20
【问题讨论】:
标签: hapijs
分页依赖于非常基本的原则。 首先,您需要知道在您拥有的页面中显示的特定查询中,您有多少行?
例如,您在页面上列出博客文章,获取总行数
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);
【讨论】: