2015-06-25 1 views
4

Как настроить платину-sw-cache Polymer или платину-sw-fetch для кэширования всех URL-адресов, за исключением/_api, который является URL-адресом API Hoodie? Я настроил платиновый-SW-выборку элемент для обработки/_api пути, то платина-SW-кэш для обработки остальных путей, следующим образом:Как настроить платину-sw- * Polymer для НЕ кэширования одного URL-адреса?

<platinum-sw-register auto-register 
         clients-claim 
         skip-waiting 
         on-service-worker-installed="displayInstalledToast"> 
    <platinum-sw-import-script href="custom-fetch-handler.js"></platinum-sw-import-script> 
    <platinum-sw-fetch handler="HoodieAPIFetchHandler" 
       path="/_api(.*)"></platinum-sw-fetch> 
    <platinum-sw-cache default-cache-strategy="networkFirst" 
        precache-file="precache.json"/> 
    </platinum-sw-cache> 
</platinum-sw-register> 

заказ выборка-handler.js содержит следующие. Его цель состоит в том, чтобы просто вернуть результаты запроса так, как если бы браузер не обработал запрос.

var HoodieAPIFetchHandler = function(request, values, options){ 
    return fetch(request); 
} 

не кажется, что будет правильно работать, что после того, как пользователь 1 подписал в, затем выписался, то пользователь 2 знака в, а затем на вкладке Network Chrome Dev Tools' Я могу видеть, что Hoodie регулярно продолжается чтобы сделать запросы конечных точек API ОБА пользователей, как следующее:

http://localhost:3000/_api/?hoodieId=uw9rl3p 
http://localhost:3000/_api/?hoodieId=noaothq 

Вместо этого он должен делать запросы только один из этих API конечных точек. На вкладке «Сеть» каждый из этих URL появляется дважды в строке, а в столбце «Размер» первый запрос говорит «(из ServiceWorker)», а второй запрос указывает размер ответа в байтах, если это имеет значение.

Другая проблема, которая кажется связанной, заключается в том, что при входе в систему как пользователь 2 и отправке формы приложение записывается в базу данных пользователя 1 на стороне сервера. Это заставляет меня думать, что проблема связана с тем, что приложение не может обойти кеш для маршрута/_api.

Должен ли я использовать как платиновый sw-cache, так и платиновую sw-fetch в одном элементе платинового sw-register, поскольку состояние документов является альтернативой друг другу?

+0

Только что-то подобное работает. Это помогло. Благодарю. – jptknta

ответ

3

В общем, то, что вы делаете, должно работать, и это законный подход.

Если есть HTTP-запрос, который соответствует пути, определенному в <platinum-sw-fetch>, то этот пользовательский обработчик будет использоваться, а обработчик по умолчанию (в данном случае - реализация networkFirst) не будет запущен. HTTP-запрос может быть отредактирован только один раз, поэтому нет возможности задействовать несколько обработчиков.

Я провел несколько местных образцов и подтвердил, что мой обработчик <platinum-sw-fetch> правильно перехватил запросы. При отладке этого локально полезно добавить в свой собственный обработчик console.log() и проверить эти журналы через интерфейс Inspecture chrome://serviceworker-internals или использовать тот же интерфейс для установки некоторых точек останова в вашем обработчике.

Ожидается, что вы видите на вкладке «Сеть» на контролируемой странице - там регистрируются сетевые взаимодействия обслуживающего персонала, независимо от того, происходят они из вашего настраиваемого HoodieAPIFetchHandler или по умолчанию обработчик networkFirst по умолчанию. Сетевые взаимодействия с точки зрения контролируемой страницы также записываются в журнал - они не всегда соответствуют друг другу с деятельностью обслуживающего работника, поэтому регистрация в обоих случаях иногда пригодится.

Поэтому я бы рекомендовал глубже изучить причину, по которой ваше приложение выполняет несколько запросов. Это всегда сложное мышление о кэшировании персонализированных ресурсов, и есть несколько способов, с помощью которых вы можете столкнуться с проблемами, если в конечном итоге вы будете кэшировать ресурсы, персонализированные для другого пользователя. Взгляните на строку кода, которая отключает второй запрос /_api/ и выясняет, исходит ли он из кэшированного ресурса, который нужно очистить, когда ваши пользователи выходят из системы.<platinum-sw> использует sw-toolbox library под капотом, и вы можете использовать его uncache() method непосредственно в пользовательских сценариях обработчика для выполнения обслуживания кешей.

+0

Я поставил операторы console.log() и отладчика внутри и вне моей функции пользовательского обработчика, незарегистрировал экземпляр рабочего стола, закрыл и снова открыл вкладку, и не вижу эти сообщения журнала в хромовом: // журнале serviceworker-internals, и отладчик не приостанавливает выполнение в моих инструкциях отладчика. Как проверить, работает ли мой пользовательский обработчик? – timblack1

+0

Моя проблема в том, что я создал два экземпляра Hoodie. Я отмечаю ваш ответ как правильный, потому что вы дали такой хороший и полезный ответ, и вы рекомендовали внимательно изучить код, который сделал второй запрос, что привело к решению. Спасибо! – timblack1

 Смежные вопросы

  • Нет связанных вопросов^_^