【发布时间】:2017-10-17 12:18:13
【问题描述】:
我有一个控制器,它进行另一个 api 调用并循环遍历结果,创建自定义对象并返回结果。
添加分页和过滤器的最佳方法是什么? 在我手动操作之前,我认为必须有一种方法可以使用 Sails 框架。
我当前的控制器代码是:
request.get({
url: 'https://api.nytime.com/v1/articles?apiKey=xxxx&source=Client1'
}, function(error, response, body) {
if (error) {
sails.log.error(error);
}
else {
var asd = JSON.parse(body);
if (asd.status == 'error') {
sails.log.error(asd.message);
return res.send(asd);
return false;
}
var newRtnStr = new Array();
var b = new Object();
for (var i = 0; i < asd.articles.length; i++) {
b = {
"title": "" + asd.articles[i]["title"],
"source": "" + asd.articles[i]["author"],
"description": "" + asd.articles[i]["description"],
"link": "" + asd.articles[i]["url"],
"category": "NYTimes",
"media": asd.articles[i]["urlToImage"],
"rssdate": "" + asd.articles[i]["IL.pubdate"],
"id": "" + i,
"createdAt": "" + asd.articles[i]["publishedAt"],
"updatedAt": "" + asd.articles[i]["publishedAt"]
}
newRtnStr.push(b);
}
return res.send(newRtnStr);
我认为我在这里没有使用模型,它只是从我的路由中调用的控制器。
我遵循了描述如何使用蓝图和服务来过滤和创建分页的教程,但我不确定如何使用它,因为我的模型在这里是空的。
一旦我在 blueprints 文件夹下找到了 find.js,在 services 文件夹下找到了 ActionUtilityService.js,教程说调用以下内容。
const Pagination = require('sails-pagination')
const buildParams = Pagination.build(q.query)
PublicNews
.find(buildParams)
.then((models) => {
return [
models,
PublicNews.count(buildParams)
]
})
在我的例子中,“PublicNews”是我的模型,但它是空的。根据上面的代码,我的自定义对象有数据,需要过滤和分页,称为“newRtnStr”。
【问题讨论】:
-
您是否已经检查过此插件 (npmjs.com/package/sails-pagination) 是否对您有用?
-
你不能用angularjs之类的东西在客户端做分页吗?
-
感谢您的cmets,由于我正在构建和API,因此我无法使用客户端分页,因此必须在服务器端进行分页和过滤。我修改了上面的问题,并展示了我使用sails-pagination面临的挑战。
-
sails 中可用的分页绝对适用于您通过模型管理的您自己的数据库。如果不是来自您自己的数据库,那么开箱即用的东西都不会起作用(
.sort、.limit、.skip等)。 -
正确的做法可能是让您正在使用的 api 处理分页(如果可以)。可能有一种方法可以在 api 中处理您想要多少条记录、如何排序、跳过多少条等。如果他们不提供,他们就只能在控制器中完成这项工作。你能告诉我们你正在获取什么样的记录吗?在自己的数据库中创建自己的镜像记录是否值得?