You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django PWA的serviceworker执行Cache.addAll报Request failed错误如何解决?

错误根因

Cache.addAll() 方法要求传入的所有资源路径都能返回 200级别的HTTP响应,只要任意一个请求返回404/301/403等非2xx状态,就会直接抛出该Promise错误。你将参数设为空数组仍报错,大概率是浏览器还在运行之前注册的旧版Service Worker,修改后的代码没有被加载生效。

修复方案

方案1:无离线需求的极简修复(推荐)

既然你暂时不需要离线使用功能,可以直接移除预缓存逻辑,将serviceworker.js修改为如下内容即可:

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request).then(function(response) {
      return response || fetch(event.request);
    })
  );
});

方案2:保留缓存逻辑的修复

如果后续需要支持离线功能,先修正资源路径配置:

  • 检查Django项目urls.py中是否配置了对应/index的路由,注意Django默认开启APPEND_SLASH配置,访问/index会自动301重定向到/index/,跨状态码请求会导致addAll失败
  • 将cache.addAll参数中的路径修改为实际可正常访问的路径,比如首页路径为根路径就写'/',或者补全末尾斜杠:
var staticCacheName = 'djangopwa-v1';

self.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open(staticCacheName).then(function(cache) {
      return cache.addAll([
        '/index/', // 适配Django带末尾斜杠的路由规则
      ]);
    })
  );
});

self.addEventListener('fetch', function(event) {
  var requestUrl = new URL(event.request.url);
  if (requestUrl.origin === location.origin) {
    if ((requestUrl.pathname === '/')) {
      event.respondWith(caches.match('/index/'));
      return;
    }
  }
  event.respondWith(
    caches.match(event.request).then(function(response) {
      return response || fetch(event.request);
    })
  );
});

清理旧Service Worker

修改代码后必须手动更新浏览器注册的Service Worker,否则修改不会生效:

  • 打开Chrome开发者工具 → 「应用(Application)」标签 → 左侧选择「服务工作线程(Service Workers)」 → 点击「更新」或「取消注册」删除旧worker,刷新页面后会自动注册新版worker
  • 可以勾选「重新加载时更新」选项,后续刷新页面会自动同步最新的service worker代码

内容的提问来源于stack exchange,提问作者catBuddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:54:08