Start · Sprachen · JavaScript · Referenz · PushEvent.data

PushEvent.data

Eigenschaft

Schreibgeschützte Eigenschaft, die ein <code>PushMessageData</code>-Objekt mit den Nutzdaten der empfangenen Push-Nachricht liefert, oder <code>null</code>, wenn keine Daten gesendet wurden.

seit JavaScript Baseline 2023: Chrome 50+, Firefox 44+, Edge 17+, Kategorie: webapi

Signatur

PushEvent.data

Beschreibung

Die Eigenschaft data eines PushEvent gibt Zugriff auf die Nutzdaten (Payload), die ein Anwendungsserver über einen Push-Dienst an eine PushSubscription geschickt hat. Das Ereignis wird ausschließlich im Service Worker ausgelöst, und zwar über self.addEventListener("push", handler) oder die Eigenschaft self.onpush.

Der Rückgabewert ist ein PushMessageData-Objekt. Damit kannst du die Daten in verschiedenen Formaten auslesen: text() für einen String, json() für ein geparstes Objekt, arrayBuffer() und bytes() für Binärdaten sowie blob() für ein Blob. Anders als bei Response laufen diese Methoden synchron und lassen sich mehrfach aufrufen.

Wurde die Nachricht ohne Payload gesendet (ein sogenannter „Tickle“-Push), ist data gleich null. Robuster Code prüft deshalb immer zuerst, ob Daten vorhanden sind. Typischerweise wertest du die Daten in einem Aufruf von event.waitUntil() aus und zeigst dort mit self.registration.showNotification() eine Benachrichtigung an.

Rückgabewert

Typ
PushMessageData | null
Beschreibung
Ein PushMessageData-Objekt mit den Nutzdaten der Nachricht oder null, wenn die Nachricht ohne Payload gesendet wurde.

Beispiele

JSON-Payload lesen und Benachrichtigung anzeigen (addEventListener)

// sw.js – Service Worker
self.addEventListener("push", (event) => {
  // Standardwerte, falls keine oder ungültige Daten ankommen
  let payload = { title: "Neue Nachricht", body: "Du hast ein Update." };

  if (event.data) {
    try {
      payload = event.data.json();
    } catch {
      payload.body = event.data.text();
    }
  }

  event.waitUntil(
    self.registration.showNotification(payload.title, {
      body: payload.body,
      icon: "/icons/icon-192.png",
      data: { url: payload.url ?? "/" }
    })
  );
});
Benachrichtigung „Bestellung versendet“ – „Dein Paket ist unterwegs.“ (bei Payload {"title":"Bestellung versendet","body":"Dein Paket ist unterwegs."})

Text-Payload über die onpush-Eigenschaft

// sw.js
self.onpush = (event) => {
  const text = event.data?.text() ?? "(keine Daten)";
  console.log("Push empfangen:", text);

  event.waitUntil(
    self.registration.showNotification("Info", { body: text })
  );
};
Push empfangen: Server-Wartung um 22 Uhr

Tickle-Push ohne Daten: aktuelle Inhalte nachladen

// sw.js
self.addEventListener("push", (event) => {
  if (event.data === null) {
    // Keine Payload: Daten selbst vom Server holen
    event.waitUntil((async () => {
      const res = await fetch("/api/notifications/latest");
      const { title, body } = await res.json();
      await self.registration.showNotification(title, { body });
    })());
    return;
  }

  const bytes = new Uint8Array(event.data.arrayBuffer());
  console.log(`Binär-Payload mit ${bytes.length} Bytes`);
});
Binär-Payload mit 128 Bytes

// Wichtig · Fallstricke

  • Auf null prüfen: Ohne Payload ist event.data gleich null. Ein direkter Aufruf wie event.data.json() wirft dann einen TypeError.
  • json() kann fehlschlagen: Bei ungültigem JSON wirft die Methode einen SyntaxError. Fange diesen Fehler mit try/catch ab.
  • Synchrone Methoden: PushMessageData.json(), text() usw. liefern ihren Wert direkt zurück und kein Promise. Ein await ist hier nicht nötig.
  • Verschlüsselung: Payloads müssen nach RFC 8291 (Message Encryption for Web Push) verschlüsselt sein und benötigen VAPID-Schlüssel. Bibliotheken wie web-push für Node.js übernehmen das. Die meisten Push-Dienste erlauben nur etwa 4 KB Nutzdaten.
  • Sichtbare Benachrichtigung: Chrome und Safari verlangen userVisibleOnly: true beim Abonnieren. Jeder Push muss dann eine Benachrichtigung anzeigen, sonst zeigt der Browser eine allgemeine Meldung an oder entzieht das Abonnement.
  • waitUntil verwenden: Ohne event.waitUntil() kann der Browser den Service Worker beenden, bevor die Verarbeitung abgeschlossen ist.
  • Sicherheit: Behandle Payload-Inhalte als nicht vertrauenswürdig. Übernimm z. B. URLs aus der Payload nicht ungeprüft für clients.openWindow().
  • Kompatibilität: Die Push-API funktioniert nur in sicheren Kontexten (HTTPS). Unter iOS/iPadOS gibt es sie erst ab 16.4 und nur für Web-Apps, die zum Home-Bildschirm hinzugefügt wurden.