Service-Worker addEventListener, как да използвам параметъра на събитието?

Сега се опитвам да накарам Push Notifications да работят с Node.js.

За целта последвах някои уроки и документи, които можах да намеря в мрежата и най-накрая имам нещо работещо, използвайки това, което се нарича Service Workers.

На този етап както Push Notifications на Node.js, така и Service Workers не са нещо, с което изобщо съм запознат.

Ето моят подходящ код:

.....
console.log("Registering ServiceWorker.");
const register = await navigator.serviceWorker.register('/worker.js', {
    scope: "/"
});
console.log('ServiceWorker registered.');

console.log("Registering Push.");
const subscription = await register.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: urlBase64ToUint8Array(publicVapIdKey)
});
console.log('Push registered.');

console.log("Sending Push.");
await fetch('/subscribe', {
    method: 'POST',
    body: JSON.stringify(subscription),
    headers: {
        'content-type': 'application/json'
    }

});
console.log('Push sent.');
.....

и сервизния работник:

console.log('Service Worker Loaded.');

self.addEventListener('push', e => {
    const data = e.data.json;
    console.log('Push Received');
    self.registration.showNotification(data.title, {
        body: 'It is time to go for lunch.',
        icon: 'MyLogo.png'
    })
});

И също това, в моя файл index.js:

// Subscribe Route.
app.post('/subscribe',(req,res) => {
    const subscription = req.body; // Get Push Subscription Object.
    res.status(201).json({}); // Sen 201. Resource created.
    // Create PayLoad.
    const payload = JSON.stringify({title:'This is a payload-title'});
    // Pass Object to sendNotification.
    webPush.sendNotification(subscription,payload).catch(err => console.error(err));
});

Въпросът, който искам да задам, е относно използването на втория параметър на addEventListener. Това е параметърът на събитието. Струва ми се, че този параметър трябва да е много важен за прехвърляне на информация към Service Worker, но в моя пример той е напълно безполезен и не знам как да го използвам.

Когато стартирам този пример във FireFox или Chrome, мога да видя този вид известие:

въведете описание на изображението тук

Може да се види „недефиниран“, показан на екранната снимка. Това е, което идва от data.title (идва от параметъра e). Как трябва да променя кода, за да видя нещо различно от "undefined" показано? Искам да мога да направя промяната извън този блок, разбира се:

self.addEventListener('push', e => {...})

Вече се опитах да задам някакво поле "заглавие", където мислех, че може да е решение, но нищо не работи. Очевидно не постъпвам правилно.

С други думи, по-общо казано; това, което искам да знам, е „Как да използвам параметъра за събитие на addEventListener“. Дори много основен пример (как да променя кода си за това) би бил много оценен.


person Michel    schedule 23.05.2018    source източник


Отговори (1)


Според спецификациите на Push API e.data е екземпляр на PushMessageData. Можете да прочетете повече тук за неговия интерфейс. Вашият код трябва да бъде:

self.addEventListener('push', function(e) {
    let data = {};

    if (e.data) {
        // IMPORTANT:
        // The following line does not use "e.data.json",
        // but "e.data.json()" !!!!!
        data = e.data.json();
    }

    self.registration.showNotification(data.title, {
        body: 'It is time to go for lunch.',
        icon: 'MyLogo.png'
    })
});
person kkkkkkk    schedule 23.05.2018
comment
Така че, ако (например) исках My Title да се появи вместо undefined. Как трябва да променя кода? Промяна на полето, наречено any, предполагам? - person Michel; 23.05.2018
comment
Кодът по-горе ще работи, стига насоченото съобщение от сървъра да съдържа свойството title - person kkkkkkk; 23.05.2018
comment
Сега не работи, показва само undefined. И всичко, което опитах, може да показва само undefined. Така че това наистина не работи. Моят проблем (предполагам) е, че не знам как да задам правилно свойството заглавие. - person Michel; 23.05.2018
comment
Тогава това е вашата Push API услуга, трябва да включите title в насоченото съобщение - person kkkkkkk; 23.05.2018
comment
Въпросът е точно това, което описвате: Как го правите? - person Michel; 23.05.2018
comment
Публикувайте вашия Push API сървърен код, без него не знам какво пропускате - person kkkkkkk; 23.05.2018
comment
Не е ли вече в публикацията ми, в първия блок от код (console.log(Sending Push.);....)? Ако трябва да изпратя още код, моля, уведомете ме какъв. - person Michel; 23.05.2018
comment
Това е вашият код на услугата, а не кодът на сървъра, който насочва известието към клиента (работник на услугата). Или използвате Push API услуга? - person kkkkkkk; 23.05.2018
comment
Следвах основно урок тук youtube.com/watch?v=HlYFW2zaYQM. Не съм сигурен какво имате предвид относно липсващия код. Имам също файл index.js и package.json, които не съм публикувал. Но предполагам, че няма да е много полезно. - person Michel; 23.05.2018
comment
Току-що добавих част от кода към публикацията, идващ от моя файл index.js. Надяваме се, че това ще бъде полезно. - person Michel; 23.05.2018
comment
Кодът на сървъра изглежда добре. Сигурни ли сте, че използвате e.data.json() за получаване на данни? - person kkkkkkk; 23.05.2018
comment
Добре! Открихте проблема. Наистина (както можете да видите в кода, който публикувах) използвах e.data.json вместо e.data.json(). И когато го променя, това работи и мога да видя заглавието, което съм задал. Благодаря много. Ако това беше отговор вместо коментар, щях да го приема! - person Michel; 24.05.2018
comment
Тъй като тази подробност вече се съдържаше в отговора, който бяхте дали по-горе (просто не го бях забелязал). Отидох да редактирам отговора ви с коментар, за да не го пропуснат хората, и приех отговора. - person Michel; 24.05.2018