Start · Sprachen · JavaScript · Referenz · MessageEvent.lastEventId

MessageEvent.lastEventId

Eigenschaft

Schreibgeschützter String mit der ID des zuletzt empfangenen Ereignisses. Wird vor allem bei Server-Sent Events (<code>EventSource</code>) über das Feld <code>id:</code> gesetzt.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

MessageEvent.lastEventId

Beschreibung

Die schreibgeschützte Eigenschaft lastEventId des MessageEvent-Interfaces enthält die ID des Ereignisses als String. Praktisch relevant ist sie fast nur bei Server-Sent Events: Setzt der Server im Stream eine Zeile id: 42, steht dieser Wert bei allen folgenden message-Ereignissen der EventSource in event.lastEventId.

Die Eigenschaft wird vor allem für Wiederaufnahme nach Verbindungsabbrüchen genutzt. Verbindet sich eine EventSource automatisch neu, schickt der Browser die zuletzt bekannte ID im HTTP-Header Last-Event-ID mit. Der Server kann dann genau ab diesem Punkt weitersenden, sodass keine Nachrichten verloren gehen. Den Wert selbst auszulesen hilft beim Protokollieren, beim Aussortieren doppelter Nachrichten oder wenn man nach einem kompletten Neuladen der Seite manuell dort weitermachen will, wo man aufgehört hat.

Bei anderen Quellen von MessageEvent, also WebSocket, postMessage(), MessageChannel, BroadcastChannel oder Workern, ist lastEventId normalerweise ein leerer String. Nur wenn man ein MessageEvent selbst mit dem Konstruktor erzeugt, kann man den Wert dort über die Option lastEventId setzen.

Rückgabewert

Typ
string
Beschreibung
Die ID des Ereignisses bzw. die zuletzt vom Server gesetzte ID. Ist keine ID gesetzt, ist der Wert ein leerer String "".

Beispiele

ID bei Server-Sent Events auslesen

// Server sendet z. B.:
// id: 17
// data: {"text":"Hallo"}
//
const source = new EventSource('/api/stream');

source.addEventListener('message', (event) => {
  const payload = JSON.parse(event.data);
  console.log(`Ereignis #${event.lastEventId}:`, payload.text);
});
Ereignis #17: Hallo

Doppelte Nachrichten nach Neuverbindung aussortieren

const source = new EventSource('/api/notifications');
const seen = new Set();

source.onmessage = (event) => {
  const id = event.lastEventId;
  if (id && seen.has(id)) {
    console.log('Doppelt, übersprungen:', id);
    return;
  }
  if (id) seen.add(id);
  console.log('Neue Benachrichtigung:', event.data);
};
Neue Benachrichtigung: ...

Nach einem Neuladen der Seite dort weitermachen, wo man aufgehört hat

// Letzte ID dauerhaft speichern und beim nächsten Seitenaufruf mitsenden
const lastId = localStorage.getItem('feedLastId') ?? '';
const url = new URL('/api/feed', location.origin);
if (lastId) url.searchParams.set('lastEventId', lastId);

const source = new EventSource(url);
source.onmessage = (event) => {
  if (event.lastEventId) {
    localStorage.setItem('feedLastId', event.lastEventId);
  }
  console.log(event.lastEventId, event.data);
};

MessageEvent selbst erzeugen

const evt = new MessageEvent('message', {
  data: 'Test',
  lastEventId: 'abc-123'
});
console.log(evt.lastEventId);

// Bei postMessage & Co. ist der Wert normalerweise leer
const { port1, port2 } = new MessageChannel();
port2.onmessage = (e) => console.log(JSON.stringify(e.lastEventId));
port1.postMessage('hi');
abc-123 ""

// Wichtig · Fallstricke

  • Schreibgeschützt: Wenn man event.lastEventId = '…' zuweist, wird das stillschweigend ignoriert bzw. wirft im Strict Mode einen TypeError.
  • Die ID bleibt bestehen: Laut SSE-Spezifikation gilt eine gesetzte ID für alle folgenden Ereignisse, bis der Server eine neue sendet. Eine leere Zeile id: setzt sie auf den leeren String zurück. Mehrere Nachrichten können deshalb dieselbe lastEventId haben, wenn der Server nicht bei jeder Nachricht eine ID mitschickt.
  • Enthält die id:-Zeile das Nullzeichen U+0000, wird sie ignoriert.
  • Der Header Last-Event-ID wird nur beim automatischen Neuverbinden gesendet, nicht beim ersten Verbindungsaufbau mit einer neuen new EventSource(). Wer über ein Neuladen der Seite hinweg weitermachen will, muss die ID selbst speichern und z. B. als Query-Parameter mitschicken.
  • Bei WebSocket, postMessage(), Workern und BroadcastChannel ist der Wert immer "".
  • Die ID kommt vom Server. Sie ist also keine vertrauenswürdige Eingabe und sollte vor der Nutzung (z. B. im DOM) geprüft werden.
  • Die Eigenschaft wird von allen modernen Browsern unterstützt, ebenso in Web Workern.