Service-Worker,“TypeError:<anonymous> 处的请求失败”

Posted

技术标签:

【中文标题】Service-Worker,“TypeError:<anonymous> 处的请求失败”【英文标题】:Service-Worker, "TypeError:Request failed at <anonymous>" 【发布时间】:2018-07-27 11:43:43 【问题描述】:

我希望你能帮助我解决我的问题。 目前,我与服务人员构建了一个 PWA。它注册成功,但安装有问题。

“caches.open”-promise 导致错误:“TypeError: Request failed at”。您可以在 Chrome 中看到缓存已注册,但为空。 我已经检查过缓存网址一千次了..

这是我的 Service-worker 代码

var CACHE_NAME = 'surv-cache-1';

var resourcesToCache = [
    '/',
    '/index.html',
    '/jquery-3.2.1.min.js',
    '/pouchdb.min-6.4.1.js',
    '/styles/inline.css',
    '/scripts/app.js'
];

self.addEventListener('install', function(event) 
  event.waitUntil(
    // open the app browser cache
    caches.open(CACHE_NAME).then(function(cache) 
        console.log("Install succesfull");
        // add all app assets to the cache
        return cache.addAll(resourcesToCache);
    ).then(function(out)
        console.log(out);
    ).catch(function(err)
        console.log(err);
    )
  );
);

self.addEventListener('fetch', function(event) 
  event.respondWith(
    // try to find corresponding response in the cache
    caches.match(event.request)
      .then(function(response) 
        if (response) 
          // cache hit: return cached result
          return response;
        

        // not found: fetch resource from the server
        return fetch(event.request);
      ).catch(function(err)
          console.log(err);
      )
  );
);

还有我的注册码:

<script>
    if ('serviceWorker' in navigator) 
        navigator.serviceWorker.register('service-worker.js').then(function(registration) 
            console.log('Service worker registered:'+registration.scope);
        ).catch(function(e) 
            console.log(e);
        );
    ;

我没听懂..我希望你有一个想法:)

编辑:我想我现在知道为什么它不起作用了。我有我的域的身份验证,所以不是每个人都可以访问它。 当我的服务人员想要缓存数据时,它得到了 401。所以这似乎是身份验证的问题。

也许有人已经遇到过同样的问题?

【问题讨论】:

同样的问题,还没找到解决办法。 【参考方案1】:

当您的 resourcesToCache 包含返回 404 响应的内容时,就会发生这种情况。确保所有内容都输入正确。还要确保范围是正确的。您可以使用以下方法检查您的工作人员范围:

if("serviceWorker" in navigator) 
  navigator.serviceWorker
  .register(`worker.js`)
  .then(registration => 
    console.log("SW scope:", registration.scope);
  );

如果您的项目不在服务器域根目录中,执行以下操作可能会有所帮助:

//your main js
if("serviceWorker" in navigator) 
  navigator.serviceWorker
  .register(`$window.location.pathnameworker.js`)
  .then(registration => 
    //do your thing
  );



//your worker js
let resourcesToCache = [
  './',
  './index.html',
  './jquery-3.2.1.min.js',
  './pouchdb.min-6.4.1.js',
  './styles/inline.css',
  './scripts/app.js',
];
//...

附带说明,您应该从 CDN 加载库(jQuery、pouchdb)以提高性能。这些也可以缓存:

let resourcesToCache = [
  './',
  './index.html',
  'https://code.jquery.com/jquery-3.3.1.min.js',
  'https://cdnjs.cloudflare.com/ajax/libs/pouchdb/6.4.3/pouchdb.min.js',
  './styles/inline.css',
  './scripts/app.js',
];

【讨论】:

关于 404 响应的那一点非常适合我!【参考方案2】:

当我在windows机器上本地开发并在linux服务器上部署时发生这种情况,问题出在路径上。您需要添加一个“。”在你的路径之前让它像“./”如下:

var resourcesToCache = [
'./',
'./index.html',
'./jquery-3.2.1.min.js',
'./pouchdb.min-6.4.1.js',
'./styles/inline.css',
'./scripts/app.js'

];

【讨论】:

【参考方案3】:

当我引用一个文件(指定路径中不存在)进行缓存时,这发生在我身上。当我更新文件的路径时,一切都很好。

【讨论】:

以上是关于Service-Worker,“TypeError:<anonymous> 处的请求失败”的主要内容,如果未能解决你的问题,请参考以下文章

Rails 对 service-worker.js 的未知调用

与 Angular.js 控制器通信 service-worker

service-worker 可以停止 GCM api 发送的推送通知吗?

使用 create-react-app 添加更多 service-worker 功能

Service-Worker addEventListener,如何使用事件参数?

@vue/cli-plugin-pwa 没有创建 service-worker.js