Node.js-从JSON对象参考中解析图像

时间:2019-05-31 02:21:22

标签: javascript node.js json api

我正在从远程API解析JSON数据。我正在使用的特定端点返回我想要的所有值,例如标题,描述,摘要和封面。我希望Cover字段是带有jpg url的字符串,但返回一个对象引用ID。如果发出另一个请求并传递对象ID,则URL字符串在那里。如何在不再次调用另一个端点的情况下解析图像数据?我正在使用IGDB API,并遵循其文档。 这是我的代码

    const axios = require('axios');
axios({
  url: "https://api-v3.igdb.com/games",
  method: 'GET',
  headers: {
      'Accept': 'application/json',
      'user-key': 'xxxx'
  },
  data: "fields name,summary,url,cover,popularity;sort popularity desc;limit 13;"
})
  .then(response => {
    /* GET home page. */
    router.get('/', (req, res, next) => {
      res.render('index', { pageId: 'index',
                        title: 'Homepage',
                        cards: homeCards
        });
    });
    //Iterate through the JSON array
    let r = response.data;
    console.log(response.data); 
    for (i=0; i<r.length; ++i){
      //Store json values 
        var title = r[i].name;
        var description = r[i].summary;
        var link = r[i].url;
        var imageId = r[i].cover;
        //Push values onto homeCards
        homeCards.push({
          title: title,
          link: link,
          description: description,
        });
      }

  })
  .catch(err => {
      console.error(err);
  });

我将封面ID存储在变量imageId中。如何使用它显示每个游戏的相应对象引用?

2 个答案:

答案 0 :(得分:1)

以下是使用async / await执行两个请求并根据gameId匹配封面的示例。

const axios = require('axios');

(async () => {
  const links = (await axios({
      url: "https://api-v3.igdb.com/covers",
      method: 'GET',
      headers: {
          'Accept': 'application/json',
          'user-key': 'xxxx'
      },
      data: "fields game,url"
    }).catch(err => {
        console.error(err);
    })).data

  const response = await axios({
    url: "https://api-v3.igdb.com/games",
    method: 'GET',
    headers: {
        'Accept': 'application/json',
        'user-key': 'xxxx'
    },
    data: "fields dlcs,name,summary,url,cover,popularity;sort popularity desc;limit 13;"
  }).catch(err => {
      console.error(err);
  })
       
  /* GET home page. */
  router.get('/', (req, res, next) => {
    res.render('index', { pageId: 'index',
                      title: 'Homepage',
                      cards: homeCards
      });
  });
  //Iterate through the JSON array
  let r = response.data;
  console.log(response.data); 
  for (i=0; i<r.length; ++i){
    //Store json values 
      var title = r[i].name;
      var description = r[i].summary;
      //Find the cover based on the game id
      var link = links.find(l => l.game === r[i].dlcs).url
      var imageId = r[i].cover;
      //Push values onto homeCards
      homeCards.push({
        title: title,
        link: link,
        description: description,
      });
    }
})()

编辑: 在评论中回答您的问题。 Array.prototype.find将回调函数作为其第一个参数。在上面的代码片段中,我使用了ES6 Arrow Function作为回调传递,以查找等效于以下内容的

links.find(function(l) {
  var boolean = l.game === r[i].dlcs
  return boolean
}).url

答案 1 :(得分:0)

大家好,感谢您的帮助。答案比我要容易得多,在阅读文档时这是我的坏选择。您所要做的就是在axios函数中指定子字段。

data: "fields name,summary,url,cover,popularity,cover.url;sort popularity desc;limit 13;"

cover.url带给我每个游戏的图片网址