11. Juni 2012

NodeJS Dateien aus Verzeichnis einlesen und ausgeben

11. Juni 2012 - Geschrieben von Martin - Keine Kommentare

Vieles bei NodeJS läuft synchron ab, was die Handhabung öfter etwas erschwert, wenn man wie ich z.B. von PHP kommt. Eben musste ich eine Lösung finden, wie ich alle Dateien aus einem Verzeichnis mit Inhalt einlesen, parsen und ausgeben kann.

Einen Array mit allen Dateien zu bekommen war kein Problem.

fs.readdir(filePath, function(err, files) { });

Nun wollte ich in dem Callback eine foreach Schleife laufen lassen um jede Datei einzulesen, zu parsen und an eine Variable anhänngen zu lassen. Natürlich auch kein Problem… Aber…

files.forEach(function(file) {
	fs.readFile(filePath + file, 'utf-8', function(err, data) {
		html += markdown(data.toString());
	});
});

wie gebe ich die Variable html nun an den Client zurück? Denn alles was nach dem „readdir“ kam, würde bereits ausgeführt, wenn ich es nach der foreach setze wurde es auch bereits ausgeführt. Also kommt hier Trick 17.

fs.readdir(filePath, function(err, files) {
	i = 0;
	files.forEach(function(file) {
		i++;
		fs.readFile(filePath + file, 'utf-8', function(err, data) {
			html += markdown(data.toString());
			if(--i === 0) {
				res.send(html);
			}
		});
	});
});

Eh alter was? Ja schon klar ;-) Und zwar setzen wir nachdem wir den Array mit den Dateinamen bekommen haben die Variable i, weisen ihr den Wert 0 zu und beim durchlaufen der einzelnen Dateien zählen wir immer um eines hoch. Wenn wir nun die Dateien einlesen zählen wir in der if Abfrage immer um eines runter und wenn in diesem Moment die Variable i auf 0 gesetzt wird, senden wir den Inhalt. Ja so einfach geht das. Achja, das *minus minus* muss vor das i, denn ansonsten wird der Wert von i für die if Abfrage genommen und danach erst runtergezählt.

Schreibe einen Kommentar