服务工作者在App Engine

时间:2016-10-14 16:01:07

标签: google-app-engine caching service-worker google-app-engine-python

我的服务工作人员与我的Google App Engine应用程序一起遇到了特殊问题。服务工作者完美地安装和激活。此外,我在我构建的另一个应用程序中使用完全相同的服务工作者(它不需要任何用户登录)并且它工作正常。但是,在我当前的应用程序中,只有一个页面(App Engine使用内置用户API呈现页面并在成功登录时发送它)。我的问题是我不希望缓存来自服务器的根地址(来自服务器的呈现页面)。这是我的缓存数组文件:

var filesToCache = ['/manifest.json','/js/app.js','/js/jquery-3.js','/js/jquery.matchHeight.js','/js/materialize2.min.js','/js/vue.js','/js/vuex.min.js','/js/chart.js','/css/materialize.min.css','/css/style.css', '/images/case.jpg'];

正如您所看到的,我只是尝试缓存脚本,因为HTML必须在服务器端呈现,并且它非常紧凑,所以我不介意小网络请求是制作。这是我的服务工作者,它位于根文件夹中。

self.addEventListener('install', function(e) {
  console.log('[ServiceWorker] Install');
  e.waitUntil(
    caches.open(cacheName)
    .then(function(cache) {
      console.log('[ServiceWorker] Caching app shell');
      return cache.addAll(filesToCache);
    })
    .catch(function(e) {
      console.error(e);
    })
  );
});

self.addEventListener('activate', function(e) {
  console.log('[ServiceWorker] Activate');
  e.waitUntil(
    caches.keys().then(function(keyList) {
      return Promise.all(keyList.map(function(key) {
        if (key !== cacheName) {
          console.log('[ServiceWorker] Removing old cache', key);
          return caches.delete(key);
        }
      }));
    })
  );
});

self.addEventListener('fetch', function(e) {
  console.log('[ServiceWorker] Fetch')
  e.respondWith(
    caches.match(e.request)
      .then(function(response) {
        return response || fetch(e.request)
      })
  );
});

问题是,尽管我没有尝试缓存根地址,但服务工作者将尝试返回响应,而不是为用户的初始尝试提取。这是用户导航到应用程序后的事件序列:

1 - 登陆页面,其中显示按钮,显示'登录Google'。

2 - 成功登录后重定向到应用

预期结果:用户被重定向到Google自己的解决方案,之后,用户将被重定向回我已完全登录的应用。

实际结果:服务工作人员拦截请求,提供未定义的响应,无限制地将用户重定向回登录页面。

我对服务工作者来说很陌生,所以也许在截取响应方面缺少一些东西,我需要考虑一些边缘情况,但我不确定它是什么。我尝试将return语句拆分为首先检查是否有响应,因此如果响应未定义,则跳过返回响应语句,克隆事件,然后在获取请求中返回事件请求。但是,我得到了完全相同的结果。

以前有人遇到这个或知道该怎么办?我昨天花了这么多都无济于事,只是放弃了回复任何回复,为网络上的一切提供服务,但我真的想解决它。在此先感谢您的帮助。

0 个答案:

没有答案