Я создаю приложение vueJs с сервис-воркером. Я решил использовать Workbox с методом InjestManifest, чтобы иметь свои собственные маршруты.
при загрузке, когда онлайн: 1- ответ по сети 2- отправка тела в IDB (через localforage) 3- отправка ответа
здесь все работает отлично, sw перехватывает выборку и возвращается с соответствующим ответом, IDB содержит все подробности. ответ, отправленный обратно в fecth при подключении к Интернету: Response {type: "cors", url: "http://localhost:3005/api/events ", перенаправлено: false, status: 200, ok: true,…}
проблема в том, когда я перехожу в офлайн. мой идентификатор намерения подключиться к Locaforage и получить контент и создать ответ. Проблема в том, что этот ответ не считается подходящим для Fetch, который затем отклоняет его. Console.log подтверждает, что .catch в sw работает, но похоже, что отправленный ответ отклонен. вот console.log ответа, который я отправляю обратно, чтобы получить его в автономном режиме; Ответ {type: "default", url: "", redirected: false, status: 200, ok: true,…}
Я не знаю, не устраивает ли выборка, потому что URL-адрес ответа не такой, как в запросе, но рабочее поле должно позволять отвечать другими ответами, кроме тех, которые поступают из кеша или выборки.
вот код
importScripts('localforage.min.js')
localforage.config({
name: 'Asso-corse'
})
workbox.skipWaiting()
workbox.clientsClaim()
workbox.routing.registerRoute(
new RegExp('https://fonts.(?:googleapis|gstatic).com/(.*)'),
workbox.strategies.cacheFirst({
cacheName: 'googleapis',
plugins: [
new workbox.expiration.Plugin({
maxEntries: 30
})
]
})
)
workbox.routing.registerRoute( new RegExp('http://localhost:3005/api/'), function (event) {
fetch(event.url)
.then((response) => {
var cloneRes = response.clone()
console.log(cloneRes)
cloneRes.json()
.then((body) => {
localforage.setItem(event.url.pathname, body)
})
return response
})
.catch(function (error) {
console.warn(`Constructing a fallback response, due to an error while fetching the real response:, ${error}`)
localforage.getItem(event.url.pathname)
.then((res) => {
let payload = new Response(JSON.stringify(res), { "status" : 200 ,
"statusText" : "MyCustomResponse!" })
console.log(payload)
return payload
})
})
})
workbox.precaching.precacheAndRoute(self.__precacheManifest || [])
Я действительно застрял там, поскольку вся документация по рабочему ящику связана с использованием кеша. Я использую localforage, поскольку он поддерживает обещания, которые необходимы для работы автономной работы.
Спасибо
/api/
в вашем примере), поэтому он доступен для URL-адреса. Я бы рекомендовал придерживаться API хранилища кэша для этого варианта использования. - person Jeff Posnick   schedule 06.06.2018registerroute
на firebase API. Обработчик catch вызывается, но мой собственный ответ не работает. Я тоже возвращаю ответ. Но все равно не работает. Любая идея ? Я пробую это на локальном хосте, а не в живой среде. - person Amit   schedule 11.09.2018