Fetch API 无法加载 <URL>。请求模式是“no-cors”但重定向模式不是“follow”

问题描述 投票:0回答:1

当我禁用 Shield 时,仅在 Brave 浏览器中出现此问题。我的我的博客上有 OWA 分析文件:

https://stats.jcubic.pl/modules/base/js/owa.tracker-combined-min.js

我在博客上使用名为 Wayne 的 Service Worker 库。该库拦截所有请求并允许在浏览器中创建纯 HTTP 响应。与 Node 中的 Express.js 类似,但在 Service Worker 中。它也有类似的API。我正在使用该库在浏览器中打开 JavaScript 和 CSS 文件时向它们添加语法突出显示

但是我收到了这个错误:

Fetch API 无法加载

https://stats.jcubic.pl/modules/base/js/owa.tracker-combined-min.js
。请求模式是“no-cors”,但重定向模式不是“follow”。

该文件没有任何重定向。域 stats.jcubic.pl 已启用 CORS。

错误源自此代码(剔除不相关部分):

self.addEventListener('fetch', (event) => {
    if (filter(event.request) === false) {
        return;
    }
    const promise = new Promise(async (resolve, reject) => {
        const req = event.request;
        try {
            // Wayne logic with early return
            if (event.request.cache === 'only-if-cached' &&
                event.request.mode !== 'same-origin') {
                return;
            }
            
            fetch(event.request).then(resolve).catch(reject);
        } catch(error) {
            this._handle_error(resolve, req, error);
        }
    });
    event.respondWith(promise.catch(() => {}));
});

我不知道这行

if (event.request.cache ...
在做什么,在一些例子中找到了它。

为什么会出现这个错误,当我拦截所有请求时如何摆脱它?我试图了解此错误的原因是什么,但也想知道如何解决此问题(如果有办法)。

我更愿意在韦恩库本身中修复这个问题,这样它也可以为其他用户修复,而不仅仅是我的博客。

为了完整起见,这是将 OWA 添加到我的博客的代码片段:

  <script type="text/javascript">
   //<![CDATA[
   var owa_baseUrl = 'https://stats.jcubic.pl/';
   var owa_cmds = owa_cmds || [];
   owa_cmds.push(['setSiteId', 'b9a1a51b38e3837c9a5b309ec4122ff3']);
   owa_cmds.push(['trackPageView']);
   owa_cmds.push(['trackClicks']);
   (function() {
       var _owa = document.createElement('script'); _owa.type = 'text/javascript'; _owa.async = true;
       owa_baseUrl = ('https:' == document.location.protocol ? window.owa_baseSecUrl || owa_baseUrl.replace(/http:/, 'https:') : owa_baseUrl );
       _owa.src = owa_baseUrl + 'modules/base/js/owa.tracker-combined-min.js';
       var _owa_s = document.getElementsByTagName('script')[0]; _owa_s.parentNode.insertBefore(_owa, _owa_s);
   }());
   //]]>
  </script>

这显然是同一个没有任何直接的 URL。

我尝试将

_owa.crossorigin = '';
添加到上面的代码片段中,但没有区别。

我正在考虑向 fetch 事件添加一个名为

skip
的标志,但问题是 Promise 回调是异步的(没有其他方法可以编写此代码,有
try..catch
所以所有异步问题都得到了处理).

javascript cors fetch-api service-worker
1个回答
0
投票

问题似乎是库在发出获取请求时不使用

mode = 'cors'
中的
RequestInit
。这就是CORS机制没有被触发的原因

© www.soinside.com 2019 - 2024. All rights reserved.