如何调用另一个API并使用分页返回数据?

时间:2017-10-17 12:18:13

标签: node.js sails.js

我有一个控制器进行另一个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”。

1 个答案:

答案 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);
}