Сообщение «Требуется откат Service Worker» является внутренним сообщением об ошибке. это должно было исчезнуть с Chrome 46. EDIT: похоже, что это может быть не исправлено, что может вызывать описанные проблемы. Мы отслеживаем эту ошибку.
Более общий ответ заключается в том, что вам нужно быть очень осторожным с тем, как вы обрабатываете кэширование сервис-воркера, когда имеете дело с ответами на аутентифицированные запросы. Последующий пример кода общего назначения, скорее всего, вас укусит, и я рекомендую вам ответить на следующие вопросы, прежде чем продолжить:
- Вы обязательно хотите кэшировать ответы на аутентифицированные запросы?
- Если да, хотите ли вы использовать один и тот же подход к кэшированию для всех аутентифицированных запросов/ответов или только некоторых из них для конкретных конечных точек API? Имейте в виду, что могут быть вызовы API, которые имеют смысл только со «свежими» данными ответа.
- Какие механизмы у вас есть, чтобы справиться с истечением срока действия кэшированных ответов, когда текущий пользователь выходит из системы/переключается на другую учетную запись, вошедшую в систему? (Если вы продолжаете отвечать с ранее кэшированными ответами, это может выглядеть для пользователя так, как будто он все еще вошел в систему как первая учетная запись.)
Если вас интересует один из подходов, вы можете прочитать соответствующий раздел примера использования, связанный с Google I/ O веб-приложение 2015 года, в котором используется подход, который нам подходит для типа данных, с которыми мы имеем дело. Есть некоторый дополнительный код, который использует sw-toolbox
(ранее известный как shed
), что тоже актуально. Но ответы на все эти вопросы зависят от вашего конкретного варианта использования, поэтому, пожалуйста, хорошо все обдумайте, прежде чем что-то внедрять.
EDIT: исходя из комментария к этому ответу, цель состоит в том, чтобы полностью избежать взаимодействия сервисного работника для аутентифицированных запросов. Если это так (и это определенно упрощает ответы на другие вопросы), то вы сможете сделать что-то простое, например:
self.addEventListener('fetch', event => {
// Only call event.respondWith() if the request doesn't include an
// Authorization header. You can swap in your own header name.
if (!event.request.headers.has('Authorization')) {
event.respondWith(
// Your standard fetch(), caches.match(), etc. logic goes here.
);
}
});
В этом подходе используется тот факт, что если обработчик событий fetch
сервис-воркера не вызывает event.respondWith()
, сетевой запрос в конечном итоге будет выполняться так, как будто сервис-воркер вообще не участвовал.
person
Jeff Posnick
schedule
02.12.2015