【问题标题】:Trying to display an offline page with service workers but getting a 200 response for my request even when offline尝试使用服务人员显示离线页面,但即使在离线时也收到 200 响应我的请求
【发布时间】:2017-07-22 19:26:13
【问题描述】:

我正在尝试使用服务人员来执行以下任务:

  • 缓存一组页面。
  • 如果请求,则从缓存中返回一个页面 - 如果该页面不在缓存中,则从服务器返回。
  • 如果缓存或服务器没有响应,则返回自定义离线页面。

我有以下代码:

this.addEventListener('install', function(event) {
  console.log('Service Worker: Installing');

  event.waitUntil(

    caches.open('v1').then(function(cache) {
      console.log('Service Worker: Caching Files');
      return cache.addAll([
        '/assets/logo.svg',
        '/assets/app.css',
        '/assets/app.js',
        '/assets/common.js',
        '/offline.html'
      ]);
    })
  );
});

this.addEventListener('fetch', function(event) {
  if (event.request.method != "GET" || event.request.mode == "cors" || event.request.url.startsWith('chrome-extension')) return;
  console.log('Event to be passed', event);

  event.respondWith(
    caches.open('v1').then(function(cache) {
      return cache.match(event.request).then(function(response) {
        if (response) {
          console.log('Service Worker: Returning Cached Response', response);
          return response;
        } else {
          fetch(event.request).then(function(response) {
            console.log('Service Worker: Returning Response from Server', response);
            cache.put(event.request, response.clone());
            return response;
          }).catch((error) => {
            console.log('Fetch failed; returning offline page instead.', error);
            return caches.match('/offline.html');
          });
        }
      });
    })
  );
});

this.addEventListener('activate', function activator(event) {
  console.log('Service Worker: Activating', event);
  event.waitUntil(
    caches.keys().then(function(keys) {
      return Promise.all(keys
        .filter(function(key) {
            return key.indexOf('v1') !== 0;
        })
        .map(function(key) {
            return caches.delete(key);
        })
      );
    })
  );
});

我遇到的问题是,即使我处于离线状态,我的请求也会收到 200 响应,即使我处于离线状态并且实际上并未检索文件。

我知道这是 PWA 始终返回 200 响应的先决条件之一,但如果我的响应始终返回为 200,我该如何返回离线页面。

任何有关服务人员的帮助、建议或资源都会很有用。

干杯。

【问题讨论】:

  • 澄清一下;您在离线且缓存为空时收到此console.log('Service Worker: Returning Response from Server', response); 响应?
  • 是的,就是这样。但是,我还收到另一个可能导致它的错误:我的控制台说:““localhost:8080/page”的 FetchEvent 导致网络错误响应:一个不是响应的对象被传递给了 respondWith()。”
  • 根据这个相关的thread,在没有缓存匹配的情况下,您可能没有正确解析respondWith()。从这个documentation,传递给respondWith() 的代码应该“通过将响应或网络错误返回给Fetch 来解决”。 由于您收到了 respondWith 警告,这意味着 caches.match() 没有找到该资源。

标签: javascript caching response service-worker progressive-web-apps


【解决方案1】:

你必须处理所有事件,如果没有什么特别的事情发生,你不能只是“返回”。

this.addEventListener('fetch', function(event) {
    if (event.request.method != "GET" || event.request.mode == "cors" || event.request.url.startsWith('chrome-extension')){
        event.respondWith(fetch(event.request));
        return;
    }
....

那么你还必须返回你的 fetch 事件,否则你会破坏承诺链。

} else {
    return fetch(event.request).then(function(response) {

【讨论】:

  • 似乎是这样,我通过在我的 else 语句中从缓存返回得到了一个可行的解决方案。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-04-02
  • 2020-02-25
  • 2017-04-17
  • 2018-10-28
  • 1970-01-01
  • 2017-01-18
  • 2019-04-09
  • 2020-10-07
相关资源
最近更新 更多