【问题标题】:How to get data and response status from API using node-fetch?如何使用 node-fetch 从 API 获取数据和响应状态?
【发布时间】:2019-01-29 03:13:14
【问题描述】:

根据节点获取文档node-fetch

我们可以这样获取响应状态

fetch('https://github.com/')
    .then(res => {
        console.log(res.status);
    });

获取数据

fetch('https://api.github.com/users/github')
    .then(res => res.json())
    .then(jsonData => console.log(jsonData));

我有一个场景,我需要从响应中返回 JSON 数据和状态。我试过这样使用

     fetch('https://api.github.com/users/github')
            .then(res => res.json())
            .then(jsonData => {
             console.log(jsonData);
             console.log(jsonData.status);
      });

但是

console.log(jsonData.status)

不会返回状态。如何获取状态和输出数据

【问题讨论】:

标签: javascript node.js fetch node-fetch


【解决方案1】:

最简单的解决方案是声明一个变量并为其赋值res.status

let status; 
fetch('https://api.github.com/users/github')
  .then((res) => { 
    status = res.status; 
    return res.json() 
  })
  .then((jsonResponse) => {
    console.log(jsonResponse);
    console.log(status);
  })
  .catch((err) => {
    // handle error
    console.error(err);
  });

您也可以使用async/await

const retrieveResponseStatus = async (url) => {
  try {
    const response = await fetch(url);
    const { status } = response; 
    return status;
  } catch (err) {
   // handle error
    console.error(err);
  }
}

然后您可以将它与任何您想要的 URL 一起使用:

const status = await retrieveStatus('https://api.github.com/users/github')

【讨论】:

    【解决方案2】:

    另一种替代解决方案是使用Promise.all

    fetch('https://api.github.com/users/github')
      .then(res => Promise.all([res.status, res.json()]))
      .then(([status, jsonData]) => {
        console.log(jsonData);
        console.log(status);
      });
    

    希望对你有帮助

    【讨论】:

    • 我发现这个解决方案是迄今为止最优雅的,谢谢!
    【解决方案3】:

    我可能会走相反的方向,但我建议您使用 requestJs,因为它的社区比 node-fetch 大得多,并且提供了很多功能。

    使用 requestJs 你可以像这样获取 statusCode

     request("https://api.github.com/users/github", (err, res, body) => {
         let statusCode = res.statusCode;
     });
    

    RequestJs 还提供了很多简单的方法来调用不同的 API 方法,也很容易观察 API 请求和 API 响应。

    【讨论】:

    • 请求已被弃用
    【解决方案4】:

    这是另一个变体,使用异步 lambda 函数和数组解构:

    fetch('https://api.github.com/users/github')
      .then(async (res) => {  
        return [await res.json(), res.status];
      })
      .then(([jsonData, status]) => {
        console.log(jsonData);
        console.log(status);
      })
      .catch((err) => {
        // handle error
        console.error(err);
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2017-02-07
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多