Angular Service Worker - Не удалось загрузить ресурс: сервер ответил со статусом 504 (время ожидания шлюза)

Я использую Angular-CLI 1.6.6 и @angular/service-worker 5.2.5 в нашем приложении Angular 5.2.5. Все отлично работает как на локальном lite-сервере, так и на рабочем сервере, за исключением одного сообщения об ошибке в нашей производственной среде:

Failed to load resource: the server responded with a status of 504 (Gateway Timeout)

Просматривая скрипт ngsw-worker.js, я нашел строки (следующие 2466), где генерируется сообщение об ошибке выше:

async safeFetch(req) {
    try {
        return await this.scope.fetch(req);
    }
    catch (err) {
        this.debugger.log(err, `Driver.fetch(${req.url})`);
        return this.adapter.newResponse(null, {
            status: 504,
            statusText: 'Gateway Timeout',
        });
    }
} 

Ошибка логирования консоли в перехвате выдает следующую ошибку:

TypeError: Failed to execute 'fetch' on 'ServiceWorkerGlobalScope': 'only-if-cached' can be set only with 'same-origin' mode
    at Driver.safeFetch (ngsw-worker.js:2464)
    at Driver.handleFetch (ngsw-worker.js:1954)
    at <anonymous>

Ошибка, которая, по-видимому, связана с этим вопросом: что вызывает сбой при выполнении "выборки" для "ServiceWorkerGlobalScope": "only-if-cached" можно установить только с ошибкой режима "same-origin"?

Требование, которое генерирует эту ошибку, это любой первый доступ к приложению:

https://example.com/test/#/connect
https://example.com/test/#/map?token=[accestoken]
...

При перезагрузке приложения ошибка не повторяется.

Кто-нибудь может помочь мне здесь? Есть ли ошибка в safeFetch() работника службы (возможно, для поддержки HashLocationStrategy)? Должен ли я что-то изменить в моей конфигурации?

3 ответа

Disabling ETag header from backend solved this issue temporarily.

У меня был неправильно настроен файл конфигурации сервисного работника. я бы порекомендовал проверитьngswConfigPathвangular.jsonфайл, который у вас есть, и проверьте, какая у вас неправильная конфигурация.

С моей стороны, после удаления настроек кеша дляindex.htmlотngsw-config.json, это сработало как шарм впоследствии. У нас может быть похожая ошибка, но наш файл конфигурации сервис-воркера определенно не будет таким же.

Изменить: после того, как вы исправите конфигурацию своего сервисного работника, если эта ошибка произойдет в вашей локальной среде разработки, вам может потребоваться обновить загруженный сервисный работник в браузере, чтобы сделать это:

  • Открытые инструменты разработки
  • Перейти к приложению
  • Работники сферы услуг
  • Отметьте «Обновлять при перезагрузке».
  • Обновить (ваше приложение должно работать как обычно без жесткой перезагрузки — вы не должны снова столкнуться с проблемой при обычном обновлении)
  • Отменить «Обновление при перезагрузке»

Обратите внимание на другие ответы, данные на этот вопрос здесь

  • Я не понимаю, почему ошибка SSL-сертификата может быть связана с504 Gateway Timeout (from service worker)это на самом деле не попадает на сервер. Это происходит полностью на стороне браузера, фактически ни один удаленный запрос не генерируется.
  • Я также не понимаю, зачем менять ETAG на бэкэнде, где снова возникает ошибка в браузере, опять же, бэкэнд/интерфейсный сервер вообще не работает! Это ошибка, которую выдает Angular Service Worker, который находится на стороне браузера.

Я получал эту ошибку в браузере Chrome из-за просроченного сертификата SSL. Решением проблемы была замена SSL-сертификата на действительный.

Другие вопросы по тегам