Добрый день!
Разбираюсь с service workers, возник следующий вопрос:
Если я правильно понял принцип работы, то sw перехватывает каждый запрос к серверу и проверяет наличие запроса в кэше. В случае отсутствия он должен по идее вернуть управление оригинальному запросу, чтобы тот выполнился, но в моем случае это не происходит. Запрос просто возвращает ошибку (TypeError: Failed to fetch из actions.js).
Не понимаю, каким образом нужно указать, что при отсутствии кэша, нужно выполнить реальный запрос к серверу?
Руководствуюсь этой
статьей.
Приложение Create React App. Запросы на сервер обрабатываются через fetch в redux-thunk.
Код sw:
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE).then((cache) =>
cache.addAll(cacheData))
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(fromCache(event.request));
event.waitUntil(
update(event.request)
.then(refresh)
.catch((error) => console.error('Failed from fetch: ', error))
);
});
function fromCache(request) {
return caches.open(CACHE).then((cache) =>
cache.match(request).then((matching) =>
matching || Promise.reject('no-match')
));
}
function update(request) {
return caches.open(CACHE).then((cache) =>
fetch(request).then((response) =>
cache.put(request, response.clone()).then(() => response).catch((error) => console.error('Error from update: ', error))
)
);
}
function refresh(response) {
console.log('RESPONSE', response);
return self.clients.matchAll().then((clients) => {
clients.forEach((client) => {
const message = {
type: 'refresh',
url: response.url,
eTag: response.headers.get('ETag')
};
client.postMessage(JSON.stringify(message));
});
}).catch((error) => console.error('Error from refresh: ', error));
}