2017-10-17 3 views
0

J'ai un contrôleur qui fait un autre appel API et boucle sur les résultats, créer des objets personnalisés et retourner le résultat.Comment appeler une autre API et renvoyer des données avec pagination?

Quelle est la meilleure façon d'ajouter la pagination et le filtre sur cela? Avant de le faire manuellement, je pense qu'il doit y avoir un moyen de le faire avec le framework Sails.

Mes codes actuels du contrôleur sont les suivants:

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

Ce que je pense que je ne suis pas en utilisant le modèle ici, son contrôleur tout ce qui est appelé de mes routes.

J'ai suivi le tutoriel décrivant comment utiliser les plans et le service pour filtrer et créer la pagination, mais je ne suis pas sûr de savoir comment l'utiliser, puisque mon modèle est vide ici.

Une fois que j'ai find.js sous le dossier blueprints et ActionUtilityService.js sous le dossier des services, le didacticiel dit appelez ce qui suit.

const Pagination = require('sails-pagination') 
const buildParams = Pagination.build(q.query) 
PublicNews 
    .find(buildParams) 
    .then((models) => { 
     return [ 
     models, 
      PublicNews.count(buildParams) 
     ] 
    }) 

Dans mon cas "PublicNews" est mon modèle, mais il est vide. Basé sur les codes ci-dessus, mon objet personnalisé qui a des données, et a besoin du filtre et de la pagination, s'appelle "newRtnStr".

+0

Avez-vous vérifié si ce plugin (https://www.npmjs.com/package/sails- pagination) peut vous être utile? –

+0

Vous ne pouvez pas faire la pagination côté client avec quelque chose comme angularjs? –

+0

Merci pour vos commentaires, je ne peux pas utiliser la pagination côté client depuis que je construis et API, donc la pagination et le filtre doit être fait sur la fin du serveur. Je modifie la question ci-dessus et montre à quel point je suis confronté à la pagination des voiles. – ShyBoy

Répondre

0

Embrasser HATEOAS. L'API NY Times vous donne un moyen de leur indiquer les paramètres de pagination (page, toujours 10 par).

Je passerais simplement cette information du client à eux par des paramètres de chaîne querys ou similaires. Je voudrais également donner au client seulement les liens de résultats suivants et précédents et suffisamment d'informations pour eux de comprendre le reste eux-mêmes. Le seul vrai problème est qu'ils ne vous disent pas combien de pages il y a, ce qui limite ce que vous pouvez faire avec la pagination. Vous pouvez essayer de récupérer la page suivante, juste pour vous assurer qu'il y en a une, ou pas.

Par exemple, votre objet de retour je changerais dans un objet et appliquer des métadonnées à elle:

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

Merci Paul. Le NYtime est juste un échantillon de remplissage, je fais un appel à un autre serveur qui fournit 100 flux par appel, de sorte que je cherche une solution qui me permet de filtrer et de page basée sur mon objet client qui est créé. qui est newRtnStr. – ShyBoy

+0

aussi je ne suis pas sûr que ce soit la bonne façon que je le fais ou non. – ShyBoy

+0

J'ai suivi l'article suivant pour implémenter la pagination. https://hellosails.com/how-to-implement-url-pagination-for-sails-js-api/ Mais le service nouvellement ajouté n'est pas appelé, dois-je faire quelque chose pour invoquer le service? Dans mon cas, mon modèle est vide mais mon contrôleur a les codes ci-dessus pour appeler une autre API, récupérer les données et les renvoyer, lorsque j'utilise les codes de cet article pour voir si la pagination fonctionne, elle est complètement ignorée. Dois-je faire quelque chose pour invoquer le service? – ShyBoy