【问题标题】:Retrieving JSON data from an Axios response从 Axios 响应中检索 JSON 数据
【发布时间】:2020-06-18 06:51:49
【问题描述】:

我正在使用 TypeScript 创建一个 Node.js 应用程序,并且我想从外部 API 检索 JSON 数据。我有我正在使用的代码的演示版本,无法放置我的实际代码库。

private async getData() {
    return await Axios.get(
        `http://dummy.restapiexample.com/api/v1/employees`
    ).then(response => {
        return response.data;
    });
}

getReleaseResults() {
    this.getData().then(responseData => {
        responseData.data.data.forEach((element: any) => {
            console.log(element);
        });
    });
}

我得到的错误信息是:(node:6068) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined 在 C:\Users\Caoilinn.Hughes\OneDrive\Documents\TypeScript Demos\Azure 测试结果电子邮件扩展\emailAzureExtension\app\out\js\apiCaller.js:43:36 在 processTicksAndRejections (internal/process/task_queues.js:97:5) (节点:6068) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:1)
(节点:6068)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

如果我没有 for each 并将其替换为

console.log(responseData.data.data)

我没有遇到任何问题。仅供参考,结果集有一个 data 属性,因此是“data.data”

【问题讨论】:

  • 看起来您的 responseData.data.data 不是一个数组。你能检查一下它有什么价值吗?
  • 看我的回答。它应该可以解决您的问题

标签: node.js typescript promise axios


【解决方案1】:

问题是您已经从 get 函数返回 response.data,然后您又在执行 data.data,这将不起作用。

看到这个。删除多余的数据。

getReleaseResults() {
    this.getData().then(responseData => {
        responseData.data.forEach((element: any) => {
            console.log(element);
        });
    });
}

【讨论】:

  • 额外的数据是需要的,如果你看链接就会看到,最初的response.data是从axios响应中获取JSON数据,第二个数据是因为实际的JSON data 有一个 data 属性,它本身就是一个 JSON 对象的列表。
  • 没关系。在您的 getData 中,您已经在执行 response.data 并返回它。所以这意味着你正在有效地做response.data.data.data.forEach。希望这是有道理的。
  • 谢谢,实际上直到现在还看不到,我已经看同样的东西太久了。我正在查询的实际 REST API 没有“数据”属性作为响应,因此那里没有发生这种情况......需要退后一步才能真正看到问题
【解决方案2】:

添加 catch 块以获取错误(如果有)。预期的反应是什么?尝试记录它。

return await Axios.get(
        `http://dummy.restapiexample.com/api/v1/employees`
    ).then(response => {
        console.log(response);
        return response.data;
    }).catch(err => console.log(err));

【讨论】:

  • 错误实际上发生在 getReleaseResults() 函数中,如果我在 try catch 中包围 foreach 会出现错误,TypeError: Cannot read property 'forEach' of undefined
  • 预期的响应是什么,您在返回之前记录了响应吗?
  • 问题是我看东西不够硬,因为响应有一个“数据”属性,我想访问其中的 JSON 对象,我必须像 response.data.data 一样访问它但实际上我有一个额外的 .data 我没有注意到。
猜你喜欢
  • 2017-08-10
  • 2020-03-12
  • 2014-01-03
  • 2019-01-12
  • 1970-01-01
  • 2020-10-30
  • 2019-04-17
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多