【发布时间】:2020-05-11 16:06:53
【问题描述】:
我使用 service worker 作为代理,它抛出 TypeError: Failed to fetch random and in a奇怪的方式。
有时,const formData = await request.formData(); 失败并抛出 TypeError: Failed to fetch。
我将文件存储在 FormData 中,await request.formData() 在大多数情况下都可以正常工作。但是,如果某个特定文件一次失败,那么下一次它将失败,仅针对该特定文件。其余文件都可以工作(除了这种罕见的情况)。
如果我知道可能出了什么问题,我将不胜感激,它是 Service Worker 错误,还是可能存在可能导致这种行为的特定条件。
async function handleUploadFileRequest(request) {
const formData = await request.formData();
const file = formData.get('file');
const response = await fetch(`${endpoint}/api/v2/uploads.json?filename=${file.name}`, {
method: 'POST',
headers: {
'Content-Type': 'application/binary'
},
body: file,
});
return response.clone();
}
self.addEventListener('fetch', (event) => {
if (!token || !endpoint) {
const params = new URL(location).searchParams;
endpoint = params.get('endpoint');
token = params.get('token');
}
const handleRequest = async () => {
try {
const { request } = event;
if (request.method === 'POST') {
const isUploadFileRequest = request.url.includes('/request_uploads');
const isSubmitFormRequest = request.url.includes('/request');
if (isUploadFileRequest) {
return handleUploadFileRequest(request);
}
if (isSubmitFormRequest) {
return handleSubmitRequest(request);
}
}
if (request.method === 'DELETE') {
const isDeleteFileRequest = request.url.includes('/requests/new');
if (isDeleteFileRequest) {
return new Response(true, { status: 200 });
}
}
if (request.method === 'GET') {
const isSuggestionsRequest = request.url.includes('/suggestions');
if (isSuggestionsRequest) {
const url = request.url;
const newUrl = `${url}&jwt=${token}`;
const newRequest = new Request(newUrl, request);
const response = await fetch(newRequest);
return new Response(await response.text(), {
status: response.status,
headers: { 'content-type': 'application/json' }
});
}
const isAnswerBotRequest = request.url.includes('/answerBot.js');
if (isAnswerBotRequest) {
return new Response('var answerBot = { init: (locale) => {}};', { status: 200 });
}
}
return fetch(request);
} catch (error) {
return fetch(request);
}
};
event.respondWith(handleRequest());
});
【问题讨论】:
-
您能发布您的整个
fetch处理程序吗?那 sn-p 一定不是一切;如果是,那么您将使用Response或undefined来响应所有未上传的网络请求。 -
感谢您的回复,我已经更新了一个 fetch 处理程序 sn-p,但我很确定我只处理
handleUploadFileRequest中的上传请求,其余请求按预期处理跨度>