服务工作者网络错误获取更详细的信息
2024-03-21 12:02:43
服务工作者:获取更详细的网络错误信息
问题
服务工作者中常见的错误“TypeError: Failed to fetch”提供的信息非常有限,这使得在“离线页面”中向用户提供有用的反馈和调试服务工作者变得困难。
解决方案
1. 使用 event.detail
属性
当 fetch()
请求失败时,event.detail
属性包含一个 DOMException
对象,其中包含 code
属性,它提供有关错误类型的更具体信息。
2. 检查 navigator.onLine
属性
此属性表示设备是否处于联机状态。如果 navigator.onLine
为 false
,则表明存在网络连接问题。
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
语句- 日志记录库