Menu

Node.js fs.writeFile: Dateien schreiben, anhängen, anlegen

Eine Datei schreibst du in Node.js mit fs.writeFile, fs.writeFileSync oder await writeFile aus fs/promises. Fehlt die Datei, wird sie angelegt, existiert sie, wird sie ersetzt; mit appendFile hängst du ans Ende an.

Diese Seite enthält ausführbare Editoren. Bearbeiten, ausführen und Ausgabe sofort sehen.

fs.writeFile(path, data, callback) schreibt einen String oder Buffer in eine Datei. Existiert die Datei nicht, legt Node sie an; existiert sie, wird der alte Inhalt ersetzt. fs.writeFileSync(path, data) macht dasselbe und wartet, bis das Schreiben fertig ist, und fs.appendFile hängt ans Ende der Datei an, statt sie zu ersetzen.

Es gibt saved aus und dann den Text, den es zurückgelesen hat; der Callback bekommt nur einen Fehler (oder null), nie die Daten. Übergib 42 statt des Strings, und der Aufruf wirft einen TypeError: Die Daten müssen ein String oder ein Buffer sein.

writeFile, writeFileSync und fs/promises

Die drei Formen nehmen dieselben Argumente und unterscheiden sich darin, wie du auf das Ergebnis wartest.

const fs = require('fs');
const fsp = require('fs/promises');

fs.writeFileSync('a.txt', 'one');            // blocks, throws on error

fs.writeFile('b.txt', 'two', (err) => {});   // callback with err

await fsp.writeFile('c.txt', 'three');       // promise, use in async code

Nimm writeFileSync in Skripten und im Startcode und die Promise-Variante in Servern, wo ein synchrones Schreiben jede andere Anfrage blockiert, bis die Festplatte fertig ist. Die Seite zu fs/promises zeigt den Rest der Promise-API.

Mit appendFile an eine Datei anhängen

writeFile ersetzt die ganze Datei. Um eine Zeile an ein Log anzuhängen, nimm appendFile, das die Datei beim ersten Mal auch anlegt.

Das erste Lesen gibt "second\n" aus, weil das zweite writeFileSync first ersetzt hat, und das zweite gibt "second\nthird\nfourth\n" aus (JSON.stringify macht die Zeilenumbrüche sichtbar). Füg das \n selbst hinzu: Keine der beiden Funktionen tut das.

writeFileappendFile
Datei fehltLegt sie anLegt sie an
Datei existiertErsetzt den InhaltHängt ans Ende an
Standard-Flag'w''a'
Typischer EinsatzEin ganzes Dokument oder JSON speichernLogs, eine Zeile nach der anderen

Nicht überschreiben: die Option flag

Das dritte Argument kann ein Options-Objekt sein. Sein flag legt fest, was mit einer vorhandenen Datei passiert. 'wx' bedeutet "schreiben, aber fehlschlagen, wenn die Datei schon existiert", das ist der sichere Weg, eine Datei nur einmal anzulegen.

Der zweite Aufruf schlägt mit EEXIST fehl, die Datei enthält also weiterhin abc123. Ändere den Dateinamen im zweiten Aufruf in id2.txt, und beide Aufrufe geben created aus.

Die Flags, denen du am häufigsten begegnest: 'w' (Standard, ersetzen), 'a' (anhängen), 'wx' (nur anlegen) und 'ax' (anhängen, aber nur an eine neue Datei).

Erst mit fs.existsSync zu prüfen und dann zu schreiben, hat eine Lücke: Ein anderer Prozess kann die Datei zwischen Prüfung und Schreiben anlegen. 'wx' erledigt beides in einem Schritt.

JSON in eine Datei schreiben

writeFile nimmt keine Objekte an. Mach sie mit JSON.stringify zu Text; das dritte Argument, 2, rückt die Ausgabe ein, damit die Datei lesbar ist.

Die Datei enthält das Objekt über mehrere eingerückte Zeilen, und das Zurückparsen ergibt ein gleiches Objekt, deshalb gibt die letzte Zeile 2 aus. Übergib das Objekt ohne JSON.stringify, und der Aufruf wirft einen TypeError.

Zuerst den Ordner mit mkdir anlegen

writeFile legt Dateien an, keine Ordner. Schreiben nach reports/2026/june.txt, wenn reports nicht existiert, schlägt mit ENOENT fehl. Leg den Pfad zuerst mit mkdir und { recursive: true } an, das jeden fehlenden Ordner anlegt und nichts tut, wenn sie schon existieren.

Das erste Schreiben schlägt mit ENOENT fehl; nach mkdir gelingt dasselbe Schreiben, und readdir listet [ 'june.txt' ]. Bau diese Pfade in echtem Code mit path.join, damit sie auch unter Windows funktionieren.

Häufige Fehler

Annehmen, dass die Datei direkt nach dem Aufruf geschrieben ist. fs.writeFile kehrt zurück, bevor die Daten auf der Festplatte sind. Lies die Datei oder starte den nächsten Schritt im Callback, oder warte mit await auf die Promise-Variante.

Daten verlieren, weil in einer Schleife geschrieben wird. writeFile einmal pro Element aufzurufen, ersetzt die Datei jedes Mal, übrig bleibt nur das letzte Element. Nimm appendFile oder bau den ganzen String und schreib ihn einmal.

[object Object] schreiben. Ein Objekt, das durch String() oder ein Template Literal geht, wird als [object Object] geschrieben. Nimm JSON.stringify.

Häufig gestellte Fragen

Überschreibt fs.writeFile die Datei?

Ja. Mit dem Standard-Flag 'w' leert es die Datei und schreibt die neuen Daten, der alte Inhalt ist also weg. Übergib { flag: 'a' } oder nimm appendFile, um stattdessen ans Ende anzuhängen.

Legt fs.writeFile die Datei an, wenn sie nicht existiert?

Ja, es legt die Datei an. Fehlende Ordner legt es aber nicht an: Schreiben nach logs/app.log, wenn logs nicht existiert, schlägt mit ENOENT fehl.

Was kann ich als Daten übergeben?

Einen String, einen Buffer oder ein Typed Array. Alles andere, etwa ein Objekt oder eine Zahl, wirft einen TypeError, wandle Objekte also vorher mit JSON.stringify und Zahlen mit String() um.

Kann ich writeFile mehrmals gleichzeitig für dieselbe Datei aufrufen?

Nein. Zwei parallele writeFile-Aufrufe auf eine Datei können sich vermischen und gemischten Inhalt hinterlassen. Warte, bis einer fertig ist, bevor du den nächsten startest, oder sammle die Daten und schreib einmal.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

Los geht's