【发布时间】:2019-01-29 08:58:20
【问题描述】:
我对来自 service worker 的 fetch 请求与来自常规脚本的 fetch 请求之间的区别感到困惑。
我添加了一个服务工作者来拦截由链接到另一个域上的 mp3 的音频元素发出的请求,并且请求失败,因为预检请求不成功。但是,如果我从脚本发出相同的请求,它看起来像是成功的,因为没有发出预检请求。
以下是上述问题的示例故障: https://lucky-marsupial.glitch.me/
这里的代码: https://glitch.com/edit/#!/lucky-marsupial
相关代码摘录如下:
--index.html--
...
<audio src="https://traffic.libsyn.com/thefeed/126_thefeed.mp3?dest-id=149503" crossorigin="anonymous" controls="controls"> Your browser does not support the audio element. </audio>
...
--sw.js--
self.addEventListener('fetch', event => {
console.log('inside service worker', event.request.url)
event.respondWith(
fetch(event.request)
.then(response => {
if (response.status === 302) {
console.log("This line is never reached because preflight failed.")
}
return response
})
)
})
--equivalent fetch request--
fetch("https://traffic.libsyn.com/thefeed/126_thefeed.mp3?dest-id=149503",{mode: 'cors'})
.then(response => {
console.log("This line is reached because no preflight request is sent.")
return response
})
您需要重新加载页面以使服务人员生效,然后尝试播放音频,您应该会在控制台中看到错误消息。
【问题讨论】:
-
您应该提供一个关于您的问题的最小示例(最好是您问题中的代码示例)。
-
Here is an example- 请在问题中包含代码 - 即 service worker 的代码 - 你可能 做错了™ -
抱歉,说得好。我现在已经更新了。忘了我是链接到输出的网站而不是代码本身。
标签: javascript cors fetch service-worker preflight