Aus dem Kurs: Node.js lernen

Dateien erstellen

Mein kleines JavaScript-Programm soll eine To-do-Liste implementieren. Im aktuellen Zustand nimmt es bereits eine von mir noch zu erledigende Aufgabe auf der Kommandozeile entgegen. Im nächsten Schritt soll jetzt mein Programm diese Aufgabe in einer Textdatei speichern. Wie genau dieses Speichern funktioniert, das möchte ich Ihnen gerne in den kommenden Minuten zeigen. Zu den Kernmodulen, die Node.js mitbringt, gehört netterweise auch das Modul fs. Das stellt mehrere Funktionen bereit, über die ich Dateien öffnen und manipulieren kann. In meinem Programm binde ich das Modul, wie gewohnt, über require ein. In meinem Fall also mit "const fs = require("fs")". Um jetzt mit einer Datei arbeiten zu können, muss ich zunächst die benötigte Datei öffnen. Das mache ich bei mir hier mit der Funktion "fs.openSync". Die Funktion erwartet den Dateinamen, der bei mir in filename enthalten ist. Dann muss ich über ein Kürzel angeben, wie Node.js die Datei öffnen soll. Wenn ich hier beispielsweise ein r für Read angebe, kann ich die Datei später nur lesen, aber nichts in sie hineinschreiben. Ich möchte aber gleich einen Text an die Datei anhängen. Daher ist für mich a das passende Kürzel. Sollte dabei die Datei noch nicht existieren, legt sie Node.js automatisch an. Sämtliche weitere mögliche Kürzel finden Sie in der offizielle Node.js-Dokumentation im Abschnitt über das "File system" ganz unten im Abschnitt "File system flags". Wie Sie hier sehen, gibt es recht viele Modi für ganz unterschiedliche Einsatzzwecke. Die Funktion openSync liefert mir einen sogenannten File Descriptor zurück. Das ist ein eindeutiger Bezeichner, der ab hier die Datei referenziert bzw. als Stellvertreter für diese Datei dient. Den File Descriptor muss ich daher unbedingt in einer Variablen auffangen. Ich wähle einfach "const fd". Den File Descriptor verlangen gleich alle weiteren Datei-Funktionen. Mit dem File Descriptor in der Hand kann ich jetzt meinen Text in der Datei speichern. Der entsprechende Code ist recht trivial, weshalb ich ihn schon einmal vorbereitet habe. Die Funktion "writeSync" schreibt mir Daten in eine Datei. Bei mir soll sie die zu erledigende Aufgabe speichern, wobei der entsprechende Text bei mir im Array args liegt. Der angehängte Platzhalter bzw. dieses Escape-Zeichen sorgt noch dafür, dass jede Aufgabe in einer eigenen Zeile steht. Der komplette Text soll in der Datei landen, die der File Descriptor fd repräsentiert. Nach dem Schreiben muss ich die Datei wieder schließen. Das erledigt die Funktion closeSync. Bei mir schließt sie die Datei, die der File Descriptor fd repräsentiert. Und das war bereits alles. Ob das auch funktioniert, probiere ich direkt mal an der Kommandozeile aus. Hier weise ich mein Programm an, die Aufgabe "Keller aufräumen" in der Datei zu speichern. Und wie Sie sehen, hat mir mein Programm eine Datei angelegt, in der auch meine Aufgabe zu finden ist. Ich füge mal eine weitere Aufgabe hinzu, wie etwa "Pflanzen gießen". Und wie Sie sehen, hat mein Programm die Aufgabe ordnungsgemäß angehängt. Das Speichern von Daten ist äußerst simpel. Ich muss nur die Datei öffnen, den File Descriptor schnappen, dann die Daten in die Datei schreiben und nach der Arbeit die Datei wieder schließen. Mein Code hat allerdings noch eine Unzulänglichkeit, den an der Kommandozeile übergebenen Text schreibe ich einfach ungeprüft in die Datei. Über diesen Weg habe ich aber eine Sicherheitslücke geöffnet. Grundsätzlich gilt, dass Sie alle Eingaben immer vor der Weiterverarbeitung prüfen und filtern sollten.

Inhalt