我有一个控制器进行另一个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);
我认为我在这里没有使用模型,它只是从我的路线调用的控制器。
我按照教程描述了如何使用蓝图和服务来过滤和创建分页,但我不知道如何使用它,因为我的模型在这里是空的。
一旦我在services目录下的blueprints文件夹和ActionUtilityService.js下找到.js,教程就会调用以下内容。
const Pagination = require('sails-pagination')
const buildParams = Pagination.build(q.query)
PublicNews
.find(buildParams)
.then((models) => {
return [
models,
PublicNews.count(buildParams)
]
})
在我的情况下,“PublicNews”是我的模型,但它是空的。根据上面的代码,我的自定义对象有数据,需要过滤器和分页,称为“newRtnStr”。
答案 0 :(得分:0)
拥抱HATEOAS。 NY Times API为您提供了一种向他们指示分页参数的方法(页面,总是10个)。
我只是通过querystring params或类似方法将这些信息从客户端传递给他们。我还会向客户端提供下一个和之前的结果链接以及足够的信息,以便他们自己完成剩下的工作。唯一真正的问题是,他们不会告诉你有多少页面,所以这限制了你可以用分页做什么。您可以尝试预取下一页,只是为了确保有一个或不是。
例如,您的返回对象我将更改为一个对象并将元数据应用于它:
var newRtnStr = {
meta: {
current: "https://example.com/articles?page=3", // URL to the current query results
next: "https://example.com/articles?page=4",
previous: "https://example.com/articles?page=2"
},
articles: []
};
var b = {};
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.articles.push(b);
}