Неперехваченное (в обещании) исключение DOMException при инициации pushManager.subscribe

Я пытаюсь добавить push-сообщения в свой сервисный работник и столкнулся с проблемой, которая ускользает от меня с прошлой ночи.

В моем основном файле HTML у меня есть следующее:

<script>
    if('serviceWorker' in navigator) {
        window.addEventListener('load', () => {
            navigator.serviceWorker.register('/service-worker.js', {scope: '/pwa/'}).then(registration => {
                console.log('Service Worker Registered: ', registration);
                registration.pushManager.subscribe({userVisibleOnly:true});
            });
        })
    }
</script>

Я получаю сообщение «Service Worker Registered» на консоли. Это означает, что регистрация прошла успешно. Однако Chrome следует за ним со следующей строкой, которая ничего не говорит об ошибке:

Uncaught (in promise) DOMException (index):1

Нажав на (index):1, я перехожу к началу соответствующей страницы /pwa/ и выделяю <!DOCTYPE html>.

Это не дает мне никакой значимой информации для дальнейшего изучения вопроса.

Был бы признателен, если бы вы могли помочь мне в решении этой проблемы. Я вставлю остальную часть своего кода и настрою ниже.

  1. Бэкэнд-фреймворк: Laravel.
  2. Запись в моем webpack.mix.js
const workboxPlugin = require('workbox-webpack-plugin');
mix.webpackConfig({
        plugins: [
            new workboxPlugin.InjectManifest({
                swSrc: 'public/service-worker-offline.js', // more control over the caching
                swDest: 'service-worker.js', // the service-worker file name
                importsDirectory: 'service-worker-assets' // have a dedicated folder for sw files
            })
        ],
        output: {
            publicPath: '' // Refer: https://github.com/GoogleChrome/workbox/issues/1534
    }
});

Запись в моем service-worker-offline.js -

workbox.skipWaiting();
workbox.clientsClaim();
// some other entries, followed by
self.addEventListener('push', (event) => {
    const title =   'Aha! Push Notifications with Service Worker';
    const options = {
        'body' : event.data.text()
    };
    event.waitUntil(self.registration.showNotification(title, options))
});

Жду ваших ответов и заранее благодарю за помощь.


Приложение:

Я провел дальнейшее расследование и выяснил, что если я это сделаю...

Notification.requestPermission().then(function(permission) {
                        registration.pushManager.subscribe({userVisibleOnly: true});
                    })

тогда срабатывает push-уведомление; но ошибка все равно остается. Однако теперь ошибка указывает на строку registration.pushManager.subscribe({userVisibleOnly: true}); в JS. Что может быть причиной?




Ответы (2)


Исключение DOMException имеет детали, которые не всегда видны. Перехватите DOMException и обязательно запишите сообщение на консоль. Как правило, это будет намного информативнее. В моем случае сообщение «Регистрация не удалась — разрешение отклонено» напомнило мне, что я заблокировал все уведомления в настройках Chrome.

person bbsimonbb    schedule 18.03.2019

Если вы используете реакцию, исправьте serviceWorker.unregister() с помощью serviceWorker.register() в index.js. Я решил это так

person solo    schedule 22.10.2019