Как экспортировать работника сервиса (push-уведомления) из node.js (экспресс) в angular? - PullRequest
0 голосов
/ 06 октября 2019

Мне нужна помощь для экспорта или активации функции сервисного работника для выполнения push-уведомлений, установленных в экспрессе с углового интерфейса. Он работает в index.html с Express, но я не могу связаться с сервисным работником из внешнего интерфейса для создания и отправки полезной нагрузки через внешний интерфейс. Что я делаю неправильно? Помощь очень ценится.

Серверная часть: main.js

const publicVapidKey = 'publicVapidKey';


if ('serviceWorker' in navigator) {
  send().catch(err => console.error(err));
}


async function send() {
  // Register Service Worker
  console.log("Registering service worker...");
  const register = await navigator.serviceWorker.register('/sw.js', {
    scope: '/'
  });
  console.log('Service Worker Registered...');

  // Register Pushs
  console.log('Registering Push...');
  const subsciption = await register.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: urlBase64ToUint8Array(publicVapidKey)
  });
  console.log('Push registered...');

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

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

}

module.exports = {send}

function urlBase64ToUint8Array(base64String) {
  const padding = '='.repeat((4 - base64String.length % 4) % 4);
  const base64 = (base64String + padding)
    .replace(/-/g, '+')
    .replace(/_/g, '/');

  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);

  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

sw.js

console.log('Service Worker Loaded');

self.addEventListener('push', event => {
    const data = event.data.json();
    console.log('Push Received...');
    self.registration.showNotification(data.title, {
      body: 'Client request!',
    });
  });

routs / user.js

! Если я активирую приведенный ниже код, он выдаст referenceError: навигатор не определен!

 at Object.<anonymous> 
 at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
var push_notification = require('../client/main');

router.get('/serviceWorker', push_notification.send);

^^ Как мне экспортировать вышеуказанную функцию работника сервиса? ^^

angularimport

getService() {
    return this._http.get('http://127.0.0.1:3000/users/serviceWorker', {
      observe: 'body',
      withCredentials: true,
      headers: new HttpHeaders().append('Content-Type', 'application/json')
    })
  }

app.js имеет классическую конструкцию и хорошо работает.

...