我的服务工作人员与我的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语句拆分为首先检查是否有响应,因此如果响应未定义,则跳过返回响应语句,克隆事件,然后在获取请求中返回事件请求。但是,我得到了完全相同的结果。
以前有人遇到这个或知道该怎么办?我昨天花了这么多都无济于事,只是放弃了回复任何回复,为网络上的一切提供服务,但我真的想解决它。在此先感谢您的帮助。