302重定向不适用于使用Google Workbox

时间:2018-04-28 07:38:29

标签: javascript service-worker progressive-web-apps workbox

为了显示“add tome homescreen”警告,我想集成服务工作者和应用程序的离线功能:当用户离线时,应用程序应该只显示一个特殊的离线HTML文件。

我的服务工作人员看起来像这样:

importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.1.0/workbox-sw.js');

const CACHE_VERSION = 1;

workbox.core.setCacheNameDetails({
  prefix: 'app',
  suffix: 'v' + CACHE_VERSION
});

workbox.routing.registerRoute(
    '/offline-page.html',
    workbox.strategies.networkFirst({
        networkTimeoutSeconds: 2,
        cacheableResponse: { statuses: [0, 200] },
    })
)

workbox.routing.registerRoute(
    ({ event }) => event.request.mode === 'navigate',
    ({ url }) =>
        fetch(url.href, { credentials: 'include', redirect: 'follow', }).catch(() => caches.match('/offline-page.html'))
)

但是,只要我的应用程序返回302重定向(例如登录oder注销后),我就会在控制台中收到以下警告消息:

  

https://app.com”的FetchEvent导致网络错误响应:重定向响应用于重定向模式不是“跟随”的请求。

并且Google Chrome浏览器显示错误页面(ERR_FAILED),表示无法访问该网站。

有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您可以调整" Provide a fallback response to a route"文档中的配方,以适应您的特定限制。

有两种不同的选项可以实现这一目标,但最干净的是创建自己的network-only strategy(以模仿您在示例中使用的fetch()),链.catch()到最后,然后在构建NavigationRoute时将其用作handler

这将为您提供Route,然后您可以传递给workbox.routing.registerRoute()

// You're responsible for either precaching or
// explicitly adding OFFLINE_HTML to one of the caches.
const OFFLINE_HTML = '/offline-page.html';
const networkOnly = workbox.strategies.networkOnly();
const networkOnlyWithFallback = networkOnly().catch(() => caches.match(OFFLINE_HTML));
const route = new workbox.routing.NavigationRoute(networkOnlyWithFallback);
workbox.routing.registerRoute(route);

答案 1 :(得分:0)

这似乎可以解决问题:

const FALLBACK_URL = '/';

const networkOnly = workbox.strategies.networkOnly();

const route = new workbox.routing.NavigationRoute(({event}) => {
  return networkOnly.handle({event})
    .catch(() => caches.match(FALLBACK_URL));
});

workbox.routing.registerRoute(route);