Дубликат почтового запроса, отправленный работником сервиса
Я обнаружил эту проблему, потому что пытался решить проблему с повторяющимся пост-запросом, когда использую workbox-background-sync. В моем веб-приложении есть функция для загрузки фотографий. Но каждый раз я дважды загружал базу данных. Вот код, который у меня есть:
const bgSyncQueue = new workbox.backgroundSync.Queue(
'photoSubmissions',
{
maxRetentionTime: 48 * 60,//48 hours
callbacks: {
queueDidReplay: function (requests) {
if (requests.length === 0) {
removeAllPhotoSubmissions();
}
else {
for(let request of requests) {
if (request.error === undefined && (request.response && request.response.status === 200)) {
removePhotoSubmission();
}
}
}
}
}
});
workbox.routing.registerRoute(
new RegExp('.*\/Home\/Submit'),
args => {
const promiseChain = fetch(args.event.request.clone())
.catch(err => {
bgSyncQueue.addRequest(args.event.request);
addPhotoSubmission();
changePhoto();
});
event.waitUntil(promiseChain);
},
'POST'
);
Может потому что fetch(args.event.request.clone())
, Если я его уберу, то дублирования больше не будет. Я использую рабочий ящик 3.6.1 .
1 ответ
Наконец я нашел решение. Ниже мой код:
const photoQueue = new workbox.backgroundSync.Plugin('photoSubmissions', {
maxRetentionTime: 48 * 60, // Retry for max of 48 Hours
callbacks: {
queueDidReplay: function (requests) {
if (requests.length === 0) {
removeAllPhotoSubmissions();
}
else {
for(let request of requests) {
if (request.error === undefined && (request.response && request.response.status === 200)) {
removePhotoSubmission();
}
}
}
}
}
});
const myPhotoPlugin = {
fetchDidFail: async ({originalRequest, request, error, event}) => {
addPhotoSubmission();
changePhoto();
}
};
workbox.routing.registerRoute(
new RegExp('.*\/Home\/Submit'),
workbox.strategies.networkOnly({
plugins: [
photoQueue,
myPhotoPlugin
]
}),
'POST'
);
Я удалил fetch
, Если мы все еще хотим контролировать сами, нам нужно использовать respondWith()
, Я проверил это, это работает. Но я хотел бы использовать более рабочий способ для решения проблемы. Я использую рабочий ящик 3.6.3, и я создал свой собственный плагин, чтобы включить функцию обратного вызова fetchDidFail
обновить мои взгляды. Вот ссылки, которые я нашел: один и два. Повторных сообщений больше нет.