停止错误获取
#javascript #网络开发人员 #初学者 #fetch

内容

  1. Intro
  2. The Problem
  3. The Solution
  4. Summary

简介

我们跳入。
如果您认为我使用koude0koude1等,所以这不适用于我。
npm软件包放下,然后远离安装!

Fetch is now supported在所有主要浏览器中,甚至在NodeJS中!

这太棒了!现在,我们有一种在浏览器和后端提出请求的方法!
这么多时间和npm下载节省了!

另外,如果您需要支持真正的旧浏览器,则有一个官方的polyfill您可以在网站上加载以提供相同的获取体验。

现在让我们跳入!

问题

获取是从您的代码中提出请求的非常好的方法。

但是,我在许多教程和编码以下代码中看到的,会导致问题:

    fetch('http://example.com/movies.json')
    .then((response) => response.json())
    .then((data) => console.log(data));

即使在Mozilla docs

为什么这是一个问题?

如果您要获取端点,返回不正确的状态代码,则获取不会丢失错误。
您必须在尝试使用response.json()获得响应主体之前检查自己是否可以的状态代码。
否则,您可能最终会出现一些通用错误,而围绕造成的错误也不会上下文。

但是,您可能对自己说的好,我的终点总是会返回JSON,即使在错误场景中。
可能是这种情况,但是如果您的控制错误,例如API网关,那么您很可能会得到非JSON响应,并再次引起您的头痛调试。

解决方案

解决方案确实很简单,只需在尝试获取响应主体之前检查响应是否可以。

您可以在此示例中看到,我正在检查response.ok which indicates if your response status was in the 2XX range

但是您也可以检查特定状态。在这里,我正在检查204-没有内容状态代码,因为在这种情况下我没有任何json。

否则我拒绝承诺,在错误中返回全部响应。

我还将其包裹在试图中以进行安全捕获以捕获任何CORS,超时错误等。

    const request = new Request('http://example.com/movies.json');
    try {
      const response = await fetch(request);
      if (response.ok && response.status !== 204) {
        return response.json();
      }
      if (response.ok && response.status === 204) {
        return Promise.resolve();
      }
      return Promise.reject(response);
    } catch (e) {
      return Promise.reject(e);
    }

摘要

总而言之,获取很棒!

但是,它还有更多的内容,以处理您可能要击中任何端点的错误和不良响应,因此请仔细检查您的获取代码以确保您正在优雅处理错误。在调试任何问题时肯定会有所帮助。

快乐建筑!