Start · Sprachen · JavaScript · Referenz · NDEFMessage.records

NDEFMessage.records

Eigenschaft

Schreibgeschützte Eigenschaft, die ein eingefrorenes Array aller <code>NDEFRecord</code>-Objekte einer NDEF-Nachricht liefert.

seit JavaScript Chrome für Android 89+ (experimentell, Web NFC) Kategorie: webapi

Signatur

NDEFMessage.records

Beschreibung

Die Eigenschaft records der Schnittstelle NDEFMessage gehört zur Web-NFC-API. Sie liefert ein schreibgeschütztes Array von NDEFRecord-Objekten, also allen Datensätzen, die in einer NDEF-Nachricht (NFC Data Exchange Format) enthalten sind, zum Beispiel Text, URLs, MIME-Daten oder anwendungsspezifische externe Typen.

In der Praxis greift man darauf meistens im reading-Ereignis eines NDEFReader zu: Das Ereignisobjekt (NDEFReadingEvent) hat eine Eigenschaft message vom Typ NDEFMessage, und über message.records geht man alle Datensätze des gescannten Tags durch. Jeder Datensatz hat unter anderem recordType, mediaType, id, encoding, lang und data (ein DataView).

Das Array ist eingefroren (Object.isFrozen() ergibt true). Datensätze lassen sich also nicht nachträglich hinzufügen oder entfernen. Wer eine neue Nachricht schreiben will, erzeugt sie mit new NDEFMessage({ records: [...] }) oder übergibt die Datensätze direkt an NDEFReader.write().

Rückgabewert

Typ
ReadonlyArray<NDEFRecord>
Beschreibung
Ein eingefrorenes Array mit allen NDEFRecord-Objekten der Nachricht. Bei einem leeren Tag kann es leer sein.

Beispiele

Alle Datensätze eines gescannten Tags ausgeben

const scanTag = async () => {
  const reader = new NDEFReader();
  await reader.scan(); // erfordert Nutzergeste + Berechtigung

  reader.addEventListener('reading', ({ message, serialNumber }) => {
    console.log(`Tag ${serialNumber}: ${message.records.length} Datensatz/Datensätze`);
    for (const record of message.records) {
      console.log(`Typ: ${record.recordType}, MIME: ${record.mediaType ?? '–'}`);
    }
  });
};

document.querySelector('#scan').addEventListener('click', scanTag);
Tag 04:a2:3b:1c:5e:61:80: 2 Datensatz/Datensätze Typ: text, MIME: – Typ: url, MIME: –

Text- und URL-Datensätze dekodieren

const decodeRecords = (message) => {
  return message.records.map((record) => {
    switch (record.recordType) {
      case 'text': {
        const decoder = new TextDecoder(record.encoding ?? 'utf-8');
        return { typ: 'text', sprache: record.lang, wert: decoder.decode(record.data) };
      }
      case 'url':
        return { typ: 'url', wert: new TextDecoder().decode(record.data) };
      case 'mime':
        if (record.mediaType === 'application/json') {
          return { typ: 'json', wert: JSON.parse(new TextDecoder().decode(record.data)) };
        }
        return { typ: 'mime', mediaType: record.mediaType };
      default:
        return { typ: record.recordType };
    }
  });
};

const reader = new NDEFReader();
reader.onreading = (event) => console.log(decodeRecords(event.message));
await reader.scan();
[{ typ: 'text', sprache: 'de', wert: 'Hallo NFC' }, { typ: 'url', wert: 'https://programmierung.net' }]

Eigene NDEFMessage erzeugen und records prüfen

const message = new NDEFMessage({
  records: [
    { recordType: 'text', data: 'Raum 204', lang: 'de' },
    { recordType: 'url', data: 'https://example.com/raum/204' }
  ]
});

console.log(message.records.length);
console.log(message.records[0].recordType);
console.log(Object.isFrozen(message.records));

// Schreiben auf einen Tag
const writer = new NDEFReader();
await writer.write(message);
2 text true

// Wichtig · Fallstricke

  • Kompatibilität: Web NFC ist experimentell und wird derzeit nur von Chrome für Android (ab 89) unterstützt. Desktop-Browser, Firefox und Safari/iOS kennen NDEFReader und NDEFMessage nicht. Vorher mit 'NDEFReader' in window prüfen.
  • Die API funktioniert nur in einem sicheren Kontext (HTTPS), nur im Frame der obersten Ebene und nur bei sichtbarer Seite. scan() und write() brauchen eine Nutzergeste und die NFC-Berechtigung.
  • records ist eingefroren: push() oder direkte Zuweisungen werfen im Strict Mode einen TypeError oder werden stillschweigend ignoriert.
  • record.data ist ein DataView und kein String. Text muss man mit TextDecoder dekodieren. Bei den Typen smart-poster und bei externen Typen enthält der Datensatz eventuell eine verschachtelte Nachricht, die man mit record.toRecords() ausliest.
  • Daten von NFC-Tags sind nicht vertrauenswürdig. Den dekodierten Inhalt nie ungeprüft in innerHTML einfügen oder als URL öffnen (XSS- und Phishing-Gefahr).