【问题标题】:How to call another API and return data with pagination?如何调用另一个 API 并通过分页返回数据?
【发布时间】: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 中处理您想要多少条记录、如何排序、跳过多少条等。如果他们不提供,他们就只能在控制器中完成这项工作。你能告诉我们你正在获取什么样的记录吗?在自己的数据库中创建自己的镜像记录是否值得?

标签: node.js sails.js


【解决方案1】:

拥抱HATEOAS。 NY Times API 为您提供了一种向他们指示分页参数的方法(页面,总是每页 10 个)。

我会简单地通过查询字符串参数或类似的方式将该信息从客户端传递给他们。我也会只给客户下一个和上一个结果链接以及足够的信息,让他们自己弄清楚其余的。唯一真正的问题是他们没有告诉你有多少页,所以这限制了你可以用分页做什么。您可以尝试预取下一页,以确保有或没有。

例如,你的返回对象我会变成一个对象并应用元数据给它:

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

【讨论】:

  • 谢谢保罗。 NYtime 只是一个示例填充程序,我正在调用另一台服务器,每次调用提供 100 个提要,因此我正在寻找一种解决方案,允许我根据创建的客户对象进行过滤和分页。这是 newRtnStr.
  • 我也不确定我这样做是否正确。
  • 我已经按照下面的文章来实现分页。 hellosails.com/how-to-implement-url-pagination-for-sails-js-api 但是新添加的服务并没有被调用,是不是我需要做些什么来调用该服务?在我的情况下,我的模型是空的,但我的控制器确实有上述代码来调用另一个 API,检索数据然后返回它,当我使用本文中的代码查看分页是否有效时,它完全被忽略了。我必须做些什么来调用服务吗?
  • Sails 与此无关。你需要弄清楚你调用的服务是如何处理分页的,然后代理它。
猜你喜欢
  • 2011-09-29
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多