返回

服务工作者网络错误获取更详细的信息

javascript

服务工作者:获取更详细的网络错误信息

问题

服务工作者中常见的错误“TypeError: Failed to fetch”提供的信息非常有限,这使得在“离线页面”中向用户提供有用的反馈和调试服务工作者变得困难。

解决方案

1. 使用 event.detail 属性

fetch() 请求失败时,event.detail 属性包含一个 DOMException 对象,其中包含 code 属性,它提供有关错误类型的更具体信息。

2. 检查 navigator.onLine 属性

此属性表示设备是否处于联机状态。如果 navigator.onLinefalse,则表明存在网络连接问题。

3. 使用 AbortController

AbortController 允许我们中止 fetch() 请求。我们可以使用它来在网络连接丢失时中止请求,从而获得更具体的错误信息。

4. 捕获 unhandledrejection 事件

fetch() 请求失败时,它会触发一个 unhandledrejection 事件。我们可以捕获此事件并从拒绝对象中检索错误信息。

代码示例

self.addEventListener('fetch', event => {
  if (...) {
    const controller = new AbortController();
    const signal = controller.signal;

    event.respondWith(
      fetch(event.request, { signal })
        .catch(error => {
          let errorMessage = 'TypeError: Failed to fetch';

          if (error.detail) {
            errorMessage = error.detail.message;
          } else if (!navigator.onLine) {
            errorMessage = 'Network connection lost';
          } else if (error.name === 'AbortError') {
            errorMessage = 'Request aborted due to network connectivity issues';
          } else {
            // Handle other types of errors
          }

          console.error(errorMessage);
        })
    );

    // Abort the request if the user goes offline
    navigator.addEventListener('offline', () => {
      controller.abort();
    });
  }
});

结论

通过使用这些技术,我们可以获取比“TypeError: Failed to fetch”更有意义的错误信息。这将有助于我们在离线页面中向用户提供更有用的反馈,并更轻松地调试服务工作者。

常见问题解答

1. 这些技术可以在所有浏览器中使用吗?

除了 Edge 以下所有主流浏览器都支持这些技术。

2. 是否需要修改现有的服务工作者才能使用这些技术?

是的,需要更新服务工作者代码以使用这些技术。

3. 这些技术会影响服务工作者的性能吗?

不会,这些技术不会对服务工作者的性能产生显着影响。

4. 是否可以使用第三方库来处理网络错误?

有许多第三方库可以帮助处理网络错误,例如 fetch-intercept

5. 除了这些技术之外,还有什么其他方法可以调试服务工作者?

可以使用以下其他技术:

  • Chrome DevTools
  • console.log() 语句
  • debugger 语句
  • 日志记录库