2017-10-17 5 views
0

私は別のAPIコールを呼び出して結果をループし、カスタムオブジェクトを作成して結果を返すコントローラを持っています。別の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); 

青写真とサービスを使用してページングをフィルタリングして作成する方法について説明したチュートリアルに続いて、私のモデルはここでは空のため、どのように使用するのかはわかりません。

brueprintsフォルダとServiceUtilityService.jsの下にfind.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

がすでに確認されている場合は、このプラグイン(https://www.npmjs.com/package/sails-ページ区切り)はあなたにとって有用でしょうか? –

+0

anglejsのようなものでクライアントサイドでページネーションを行うことはできませんか? –

+0

あなたのコメントをありがとう、私はビルドとAPIは、クライアントサイドページングを使用することはできませんので、ページネーションとフィルタは、サーバー側で行う必要があります。 上記の質問を修正し、帆を使って直面している課題を示しました。 – ShyBoy

答えて

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

Paulありがとうございます。 NYtimeは単なるサンプルフィラーです。私は、呼び出しごとに100回のフィードを提供する別のサーバーを呼び出しています。そのため、作成された顧客オブジェクトに基づいてフィルタリングとページングを可能にするソリューションを探しています。これはnewRtnStrです。 – ShyBoy

+0

また、私はこれが正しい方法であるかどうかはわかりません。 – ShyBoy

+0

私はページングを実装するための次の記事に従ってきました。 https://hellosails.com/how-to-implement-url-pagination-for-sails-js-api/ 新しく追加されたサービスが呼び出されていないため、サービスを呼び出すために何かする必要がありますか? 私の場合、私のモデルは空ですが、私のコントローラは上記のコードを使って別のAPIを呼び出し、データを取得して返します。この記事のコードを使ってページネーションが機能するかどうかは完全に無視されます。私はサービスを呼び出すために何かする必要がありますか? – ShyBoy

関連する問題