Signatur
Beschreibung
Das Ereignis messageerror wird im Hauptthread am Worker-Objekt ausgelöst, wenn eine Nachricht aus dem Worker (gesendet mit postMessage() im Worker-Kontext) zwar ankommt, aber beim Empfänger nicht deserialisiert werden kann. Das ist ein anderer Fall als ein DataCloneError beim Senden: Dort schlägt die Serialisierung fehl und postMessage() wirft sofort eine Ausnahme. messageerror betrifft dagegen die Deserialisierung auf der Empfängerseite.
In der Praxis kommt das selten vor. Typische Auslöser sind zum Beispiel ein SharedArrayBuffer, der an einen Agenten-Cluster ohne Cross-Origin-Isolation übertragen wird, oder serialisierte Objekte (etwa WebAssembly.Module), die im Zielkontext nicht wiederhergestellt werden können. Das Ereignis ist ein MessageEvent. Seine Eigenschaft data ist dabei in der Regel null, weil sich der Inhalt ja gerade nicht rekonstruieren ließ.
Registrieren kannst du den Handler mit worker.addEventListener("messageerror", handler) oder über die Eigenschaft worker.onmessageerror = handler. Das Ereignis bubbelt nicht und lässt sich nicht abbrechen. Es ist sinnvoll, einen solchen Handler als Absicherung für die Fehlersuche zu registrieren, weil fehlgeschlagene Nachrichten sonst unbemerkt verloren gehen: Das message-Ereignis wird in diesem Fall nicht ausgelöst.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignistyp, hier immer "messageerror". |
|
| $handler Pflicht | (event: MessageEvent) => void | Callback, der ein MessageEvent erhält. event.data ist meist null, event.target ist der betroffene Worker. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Optionen wie once oder signal (zum Entfernen per AbortController). |
Rückgabewert
addEventListener() hat keinen Rückgabewert. Der Handler bekommt ein MessageEvent übergeben.Beispiele
Deserialisierungsfehler mit addEventListener protokollieren
const worker = new Worker(new URL('./rechner.js', import.meta.url), { type: 'module' });
worker.addEventListener('message', (event) => {
console.log('Ergebnis:', event.data);
});
worker.addEventListener('messageerror', (event) => {
// event.data ist hier in der Regel null
console.error('Nachricht vom Worker konnte nicht gelesen werden:', event);
});
worker.postMessage({ aufgabe: 'summe', werte: [1, 2, 3] });
Mit der on-Property und Aufräumen per removeEventListener
const worker = new Worker('worker.js');
// Variante 1: on-Property (überschreibt einen vorherigen Handler)
worker.onmessageerror = (event) => {
console.warn('messageerror (on-Property):', event.data);
};
// Variante 2: benannter Listener, später wieder entfernbar
const beiFehler = (event) => {
console.warn('messageerror (Listener):', event.data);
};
worker.addEventListener('messageerror', beiFehler);
// Beim Beenden aufräumen
const beenden = () => {
worker.removeEventListener('messageerror', beiFehler);
worker.onmessageerror = null;
worker.terminate();
};
setTimeout(beenden, 5000);
Serialisierungsfehler (Senden) vs. messageerror (Empfangen) unterscheiden
const worker = new Worker('worker.js');
const controller = new AbortController();
worker.addEventListener('messageerror', () => {
console.error('Empfangsseite: Deserialisierung fehlgeschlagen');
}, { signal: controller.signal });
try {
// Funktionen sind nicht klonbar: das wirft sofort beim Senden
worker.postMessage({ callback: () => 42 });
} catch (err) {
console.error('Sendeseite:', err.name);
}
// Später alle Listener auf einmal entfernen
controller.abort();
// Wichtig · Fallstricke
- Nicht mit
errorverwechseln: Das Ereigniserroram Worker meldet Skriptfehler (Ausnahmen im Worker, Ladefehler).messageerrorbetrifft nur die Deserialisierung einer Nachricht. - Nicht mit
DataCloneErrorverwechseln: Nicht klonbare Werte wie Funktionen oder DOM-Knoten führen schon beim Senden zu einer Ausnahme inpostMessage()und lösen keinmessageerroraus. - Richtung beachten: Am
Worker-Objekt kommen nur Fehler bei Nachrichten aus dem Worker an. Für die Gegenrichtung registrierst du im Worker-Skriptself.addEventListener('messageerror', …)(sieheDedicatedWorkerGlobalScope). - Nachricht geht verloren: Wird
messageerrorausgelöst, gibt es für diese Nachricht keinmessage-Ereignis. Wenn du auf eine Antwort wartest (etwa über ein Promise mit Anfrage-ID), solltest du zusätzlich ein Timeout einbauen. SharedArrayBuffer: Ohne Cross-Origin-Isolation (HeaderCross-Origin-Opener-PolicyundCross-Origin-Embedder-Policy) istSharedArrayBuffergar nicht verfügbar oder lässt sich nicht übertragen. Je nach Situation zeigt sich das als Fehler beim Senden oder alsmessageerror.- Kompatibilität: Wird von allen aktuellen Browsern unterstützt, in Safari erst ab 16.4. In Node.js gibt es das entsprechende Ereignis
'messageerror'anworker_threads.Worker(ab Node.js 14.5).