使用 fetch 方法完成的请求,在通过 .catch 捕获错误对象时,拿不到完整的 response 对象内容

654 阅读2分钟

使用 fetch

在使用fetch方法完成的请求中,通过.catch捕获错误对象时,不能直接拿到完整的response对象内容。

fetch请求失败时,.catch捕获到的错误对象通常只包含与错误相关的信息,比如网络错误、请求超时等情况的错误描述,而不包含完整的响应内容。

如果想要获取响应的具体内容,即使在请求失败的情况下,也可以在fetch的链式调用中使用then方法,并在第一个回调函数中检查响应状态。如果状态码表示错误,可以通过response.json()response.text()等方法来获取响应体内容,以便进一步分析错误原因。

以下是一个示例:

fetch('your-url')
 .then(response => {
    if (!response.ok) {
      return response.json().then(errorData => {
        throw new Error(`请求失败,状态码:${response.status}。错误信息:${JSON.stringify(errorData)}`);
      });
    }
    return response.json();
  })
 .then(data => {
    console.log('请求成功,数据:', data);
  })
 .catch(error => {
    console.error('发生错误:', error.message);
  });

在这个示例中,当请求失败时,会尝试获取响应的 JSON 内容并抛出包含错误状态码和错误信息的新错误,以便在.catch中更好地处理错误情况。

使用 axios

在使用 Axios 实现的请求中,通过 .catch 捕获错误对象时,通常可以获取到部分响应信息,但不能直接拿到完整的 response 对象内容。

当请求失败时,.catch 捕获到的错误对象通常包含一些错误信息,比如错误状态码、错误消息等。但是要获取完整的响应内容,可以在 .catch 之前的 .then 中进行处理,在 then 的第一个回调函数中判断响应状态,如果不是成功状态,可以通过访问 response.dataresponse.status 等属性来获取响应的具体内容,然后再抛出错误以便在 .catch 中进行处理。

以下是一个示例代码:

axios.get('your-url')
.then(response => {
    if (response.status!== 200) {
      throw new Error(`请求失败,状态码:${response.status}。响应内容:${JSON.stringify(response.data)}`);
    }
    return response.data;
  })
.catch(error => {
    console.error('发生错误:', error.message, '。部分响应信息:', error.response? error.response.data : '无响应信息');
  });

在这个示例中,当请求成功时,正常处理响应数据;当请求失败时,在 .catch 中可以输出错误消息以及部分响应信息(如果有响应的话)。但这种方式也不是完全等同于直接获取完整的 response 对象内容。