Сотрудник службы делает дополнительный звонок

Я пытаюсь работать с работниками службы для кэширования и столкнулся с проблемой с аутентифицированными вызовами. В настоящее время я использую https://css-tricks.com/serviceworker-for-offline/ (https://raw.githubusercontent.com/chriscoyier/Simple-Offline-Site/master/js/service-worker.js) в качестве шаблона, хотя я видел такое же поведение с помощью Google sw-toolbox.

При выполнении запроса, который использует определенные параметры заголовка для аутентификации, кажется, что браузер делает первоначальный запрос, который завершается ошибкой, а затем успешный запрос (см. изображение). Любая мысль о том, почему это происходит? Любые другие подробности, которые могут быть полезны?

Заранее спасибо, Дэн

введите здесь описание изображения


person danwoods    schedule 02.12.2015    source источник


Ответы (1)


Сообщение «Требуется откат 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
comment
Дело в том, что я не пытаюсь кэшировать аутентифицированные запросы/ответы. Я пытаюсь заставить работника службы игнорировать эти запросы и просто передавать их в обычном режиме... Спасибо за информацию, я добавлю еще несколько журналов и опубликую то, что вижу... - person danwoods; 02.12.2015
comment
Попался. Я отредактировал свой ответ, чтобы показать, как в таком случае вы можете игнорировать эти запросы. - person Jeff Posnick; 02.12.2015
comment
Потрясающий. Я проверю этот код сегодня вечером и опубликую результаты. Спасибо! - person danwoods; 02.12.2015
comment
Тот же результат: / Я изменил код, чтобы он реагировал только на выборку для определенного ресурса, и он все еще запускает вызов с ошибкой. Есть еще мысли/идеи? Соответствующий код: gist.github.com/danwoods/29abd789ededa27502b3 - person danwoods; 04.12.2015
comment
Можете ли вы опубликовать код всего вашего обработчика fetch? Можете ли вы также попробовать просто удалить этот обработчик fetch на случай, если есть еще один обработчик fetch, добавленный с помощью addEventListener в другом месте вашего кода, который также действует? - person Jeff Posnick; 07.12.2015
comment
Спасибо, что заглянули. Код обработчика выборки находится по адресу gist.github.com/danwoods/4dc19d744b753adce7a2. Я удалю обработчик. и дайте знать, если будут какие-то изменения... - person danwoods; 07.12.2015
comment
Я добавлю несколько комментариев в суть, а не отвечаю здесь. - person Jeff Posnick; 07.12.2015
comment
Хорошо, я могу воспроизвести поведение, которое вы видите, но только после перезагрузки страницы с регистрацией SW. Я собрал более простую копию по адресу gist.github.com/jeffposnick/097c50fea42be76a3e05, и она похоже, это просто случай обновления code.google.com/p/ chromium/issues/detail?id=477685, чтобы указать, что сообщение об ошибке по-прежнему вызывает путаницу и применяется непоследовательно. - person Jeff Posnick; 08.12.2015
comment
Все еще не совсем понимаю, как мы видим эту ошибку, когда нет обработчика выборки... - person danwoods; 08.12.2015
comment
Вы больше не должны видеть эту ошибку, независимо от того, есть обработчик выборки или нет. Похоже, это просто ошибка в Chrome, и я буду следить по этим каналам. - person Jeff Posnick; 08.12.2015