【发布时间】:2022-03-18 21:14:22
【问题描述】:
我使用 service worker 用下面的代码修改 fetch 响应,
self.addEventListener('install', function(event) {
console.log('install');
});
self.addEventListener('activate', function(event) {
console.log('Claiming control');
return self.clients.claim();
});
self.addEventListener('fetch', function(event) {
console.log("fetch event")
event.respondWith(
fetch(event.request).then(function (response) {
if(response.url.match('.mp4')){
console.log(event);
response.arrayBuffer().then(
buffer =>{
let length = 100
view = new Uint8Array(buffer,0,length)
for(i=0,j=length - 1; i<j; i++,j--){
view[i] = view[i] ^ view[j]
view[j] = view[j] ^ view[i]
view[i] = view[i] ^ view[j]
}
}
)
}
return response.clone();
})
);
});
这会导致这个警告和错误,
“”的 FetchEvent 导致网络错误响应: 承诺被拒绝。
sw.js:60 Uncaught (in promise) TypeError: Failed to execute 'clone' on 'Response':响应正文已被使用 在 sw.js:60
如果我将clone() 放在arrayBuffer() 之前,如下所示,
self.addEventListener('install', function(event) {
console.log('install');
});
self.addEventListener('activate', function(event) {
console.log('Claiming control');
return self.clients.claim();
});
self.addEventListener('fetch', function(event) {
console.log("fetch event")
event.respondWith(
fetch(event.request).then(function (response) {
if(response.url.match('.mp4')){
console.log(event);
responseCloned = response.clone();
responseCloned.arrayBuffer().then(
buffer =>{
let length = 100
view = new Uint8Array(buffer,0,length)
for(i=0,j=length - 1; i<j; i++,j--){
view[i] = view[i] ^ view[j]
view[j] = view[j] ^ view[i]
view[i] = view[i] ^ view[j]
}
}
)
}
return responseCloned;
})
);
});
这会导致以下警告和错误,
“”的 FetchEvent 导致网络错误响应:a “主体”被锁定的响应不能用于响应 请求。
GET http://localhost/web/357765_decrypted.mp4 net::ERR_FAILED
【问题讨论】:
标签: javascript response service-worker fetch-api