【问题标题】:Node.js - Parsing Images from JSON Object ReferenceNode.js - 从 JSON 对象参考解析图像
【发布时间】:2019-05-31 02:21:22
【问题描述】:

我正在解析来自远程 API 的 JSON 数据。我正在使用的特定端点返回我想要的所有值,例如标题、描述、摘要和封面。我希望封面字段是一个带有 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 中。如何使用它来显示每个游戏的相应对象引用?

【问题讨论】:

  • 根据他们的 API 文档,这是不可能的。将始终需要对 Covers 端点进行第二次调用。
  • 明白了,我该如何打这个电话?我会在我当前的函数中嵌套另一个 axios 函数吗?程序如何知道哪个图像属于哪个游戏?
  • 我建议使用 async/await 而不是嵌套 promise。

标签: javascript node.js json api


【解决方案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,
      });
    }
})()

编辑: 在 cmets 中回答您的问题。 Array.prototype.find 将回调函数作为其第一个参数。在上面的代码 sn-p 中,我使用了 ES6 Arrow Function 作为回调传入,以查找相当于:

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

【讨论】:

  • 我非常喜欢您的回答,但我需要帮助了解您如何根据游戏 ID 找到封面。你能更详细地解释这一行吗:var link = links.find(l => l.game === r[i].dlcs).url。特别是括号中的代码
  • 不用担心。箭头函数看起来有点奇怪。
  • 在深入研究文档后,我意识到图像没有端点。它只是在参考文献下列出。在他们的 github 上,他们推荐使用他们的 api 包装器来解析图像。这是链接:github.com/igdb/igdb-api-node
  • 文档提到了一种叫做扩展器的东西,它用于组合多个请求。我想这就是我要找的。如果这是正确的答案,我会进行一些编辑并回复你们
【解决方案2】:

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

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

cover.url 为我提供了每个游戏的图片 url

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 2015-05-16
    • 2017-12-15
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多