node.js - 如何在@get 端点中执行分页
问题描述
如果我的表中有大量记录(数百万);我怎样才能按GET
要求对它们进行分页?
LoopBack 4官方控制示例不模拟这种情况。我找不到任何关于真实案例解决方案的参考(他们提到了跳过过滤器中的分页示例,但没有提到如何将其与存储库方法一起使用。find()
)。
你有那个案例的例子或片段吗?
编辑(我看到有人投票关闭这个问题):这个问题的主要原因是防止前端开发人员通过调用巨大的查询来犯任何错误可能会影响服务器性能(以防她/他忘记使用skip
&limit
过滤器)。
解决方案
模拟分页的一种方法是强制执行limit
过滤器。
LoopBack 4 可以使用模型范围(永久链接)为您处理此问题:
@model({
settings: {
scope: {
limit: 50,
},
},
})
class MyModel extends Entity {/* ... */}
要将范围仅应用于少数几个端点,Controller
可以在将过滤器传递给 Repository 函数之前对其进行修改:
class MyController {
@get('/')
async find(
@param.filter(MyModel) filter?: Filter<MyModel>
): Promise<MyModel[]> {
const sanitizedFilter = Object.assign(filter, {limit: 50});
return this.myRepository.find(sanitizedFilter);
}
}
这两个示例执行相同的操作:对一个请求中可以查询的最大项目数实施限制。
要获取接下来的 50 个项目,API 使用者可以skip
在他们的查询中添加一个过滤器以获取下一个“页面”:
?filter={skip: 50}
推荐阅读
- php - 来自 MYSQL 的日期记录显示在基于日期 Month 的 html 表中
- c++ - {fmt}:编译时字符串格式检查不起作用
- python-3.x - Spaces.Discrete 在 OpenAI Gym 中是什么意思
- docker - 使用主机名而不是 IP 地址将清漆服务器添加到 nginx
- spring-boot - 如果需要检查用户列表是否包含特定用户,如何在 JSP-JSTL 中编写 if 语句?
- node.js - 如何在 KnexJS + bookshelf 中查询嵌套外键
- c++ - 如果将整数输入到 StringStream 中,则将其加倍并打印
- javascript - JavaScript 访问 iframe 跨域问题
- ms-word - Word Javascript API 可以做 FirstPage Header 吗?
- angular - Angular 8 中错误消息插值的国际化