【问题标题】:Service worker making extra call打额外电话的服务人员
【发布时间】:2016-03-06 06:38:30
【问题描述】:

我正在尝试与服务人员合作以进行缓存并遇到经过身份验证的调用的问题。我目前正在使用https://css-tricks.com/serviceworker-for-offline/ (https://raw.githubusercontent.com/chriscoyier/Simple-Offline-Site/master/js/service-worker.js) 作为模板,尽管我使用 Google 的 sw-toolbox 看到了相同的行为。

当发出一个依赖特定标头参数进行身份验证的请求时,浏览器似乎发出了一个失败的初始请求,然后是一个成功的请求(见图)。有没有想过为什么会这样?还有其他可能有用的细节吗?

提前致谢, 丹

【问题讨论】:

    标签: offline service-worker progressive-web-apps


    【解决方案1】:

    “需要 Service Worker 后备”消息是 an internal error message,它应该已经随 Chrome 46 消失了。编辑:不过,它看起来可能无法修复,这可能会导致所描述的问题。我们正在跟进该错误。

    一个更普遍的回应是,在处理对经过身份验证的请求的响应时,您需要非常小心处理服务工作线程缓存的方式。以下通用示例代码可能会让您反感,我建议您在继续之前回答以下问题:

    • 确实要缓存来自经过身份验证的请求的响应吗?
    • 如果是这样,您想对所有经过身份验证的请求/响应使用相同的缓存方法,还是只对特定 API 端点使用其中的一些?请记住,可能存在仅对“新鲜”响应数据有意义的 API 调用。
    • 一旦当前用户注销/切换到不同的登录帐户,您有哪些机制来处理过期的缓存响应? (如果您继续使用之前缓存的响应进行响应,用户可能会觉得他们仍然以第一个帐户登录。)

    如果您对一种方法感兴趣,可以通读与Google I/O 2015 web app 相关的relevant section of the case study,它采用了一种对我们处理的数据类型有意义的方法。有一些additional code 使用了sw-toolbox(以前称为shed),这也是相关的。但所有这些问题的答案取决于您的具体用例,因此请在实施任何事情之前考虑清楚。

    编辑:根据对此答案的评论,目的是完全避免服务工作者与经过身份验证的请求进行交互。如果是这种情况(这肯定会简化其他问题的答案),那么您应该能够做一些简单的事情,例如:

    self.addEventListener('fetch', event => {
      // Only call event.respondWith() if the request doesn't include an
      // Authorization header. You can swap in your own header name.
      if (!event.request.headers.has('Authorization')) {
        event.respondWith(
          // Your standard fetch(), caches.match(), etc. logic goes here.
        );
      }
    });
    

    这种方法利用了这样一个事实,即如果 Service Worker 的 fetch 事件处理程序不调用 event.respondWith(),则网络请求最终会继续进行,就好像根本没有任何 Service Worker 参与一样。

    【讨论】:

    • 问题是,我不想缓存经过身份验证的请求/响应。我试图让服务人员忽略这些请求并正常通过它们...感谢您提供的信息,我将添加更多日志记录并发布我所看到的...
    • 明白了。我已经编辑了我的回复,以说明在这种情况下如何忽略这些请求。
    • 太棒了。今晚我将检查该代码并发布结果。谢谢!
    • 相同的结果:/ 我将代码更改为仅响应对特定资源的提取,它仍然会触发错误调用。还有其他想法/想法吗?相关代码:gist.github.com/danwoods/29abd789ededa27502b3
    • 您能否发布整个fetch 处理程序的代码?您是否也可以尝试仅删除一个 fetch 处理程序,以防在您的代码中的其他地方添加了另一个 fetch 处理程序并且 addEventListener 也有效?
    猜你喜欢
    • 2016-01-29
    • 1970-01-01
    • 2012-04-07
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多