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-сертификата на действительный.