POST 请求获取正文的服务工作者获取事件
Service worker fetch event for POST request get body
如何在 Service Worker 中捕获 POST 请求的主体。我在 POST 请求中发送身份验证参数,所以我想拦截 service worker 中的获取请求并显示来自 IndexDB 的结果。
以下是我的服务人员的代码
self.addEventListener("fetch", event => {
let cloned = event.request.clone();
console.log(cloned.json()); //<<- This line returns error : TypeError: Failed to execute 'json' on 'Request': body stream is locked
let response = new Promise((resolve)=>{
let key='mykey'; //Genereate from body, so read body
let stored = localforage.getItem(key);
if(stored){
resolve(stored);
}else{
resolve(fetch(cloned).then(res => res.json()).then(res=>{
localforage.setItem(key,res);
}));
}
})
event.respondWith(response);
})
p.s : 如果有语法错误,请忽略。
由于请求主体是 ReadableStream,由于@Mr.Vibe 在上面的评论中提到的原因,它不能通过 event.request.body
访问,一种访问主体的方法是使用 await event.request.json()
,但是应该注意,一旦请求主体被读取,它就不能再用作请求主体,因为它会抛出类似 This ReadableStream is disturbed (has already been read from), and cannot be used as a body
的错误。所以我们最好克隆请求,然后像 await event.request.clone().json()
那样访问它的主体,这样以后我们就可以安全地使用原始请求。
self.addEventListener("fetch", async (event) => {
let clonedBody = await event.request.clone().json();
...
})
如何在 Service Worker 中捕获 POST 请求的主体。我在 POST 请求中发送身份验证参数,所以我想拦截 service worker 中的获取请求并显示来自 IndexDB 的结果。 以下是我的服务人员的代码
self.addEventListener("fetch", event => {
let cloned = event.request.clone();
console.log(cloned.json()); //<<- This line returns error : TypeError: Failed to execute 'json' on 'Request': body stream is locked
let response = new Promise((resolve)=>{
let key='mykey'; //Genereate from body, so read body
let stored = localforage.getItem(key);
if(stored){
resolve(stored);
}else{
resolve(fetch(cloned).then(res => res.json()).then(res=>{
localforage.setItem(key,res);
}));
}
})
event.respondWith(response);
})
p.s : 如果有语法错误,请忽略。
由于请求主体是 ReadableStream,由于@Mr.Vibe 在上面的评论中提到的原因,它不能通过 event.request.body
访问,一种访问主体的方法是使用 await event.request.json()
,但是应该注意,一旦请求主体被读取,它就不能再用作请求主体,因为它会抛出类似 This ReadableStream is disturbed (has already been read from), and cannot be used as a body
的错误。所以我们最好克隆请求,然后像 await event.request.clone().json()
那样访问它的主体,这样以后我们就可以安全地使用原始请求。
self.addEventListener("fetch", async (event) => {
let clonedBody = await event.request.clone().json();
...
})