内容
简介
我们跳入。
如果您认为我使用koude0或koude1等,所以这不适用于我。
将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);
}
摘要
总而言之,获取很棒!
但是,它还有更多的内容,以处理您可能要击中任何端点的错误和不良响应,因此请仔细检查您的获取代码以确保您正在优雅处理错误。在调试任何问题时肯定会有所帮助。
快乐建筑!