Übung: Arbeiten mit Pfaden
Als Entwickler bei Tailwind Traders sind Sie dabei, ein Programm mithilfe des Node.js-Pfad-Moduls und der globalen __dirname
-Variablen zu verbessern. Auf diese Weise kann das Programm beliebige JSON-Dateien dynamisch suchen und verarbeiten, unabhängig davon, von wo das Programm ausgeführt wird.
Einschließen des path-Moduls
Schließen Sie oben in der vorhandenen Datei index.js das Pfad-Modul ein.
const path = require("path");
Verwenden des aktuellen Verzeichnisses
Im aktuellen Code der index.js-Datei übergeben Sie den statischen Speicherort des Ordners stores. Der Code soll so geändert werden, dass der __dirname
-Wert verwendet wird, anstatt einen statischen Ordnernamen zu übergeben.
Erstellen Sie in der
main
-Methode eine Variable, um einen Pfad zum Verzeichnis stores mithilfe der Konstanten__dirname
zu speichern.async function main() { const salesDir = path.join(__dirname, "stores"); const salesFiles = await findSalesFiles(salesDir); console.log(salesFiles); }
Führen Sie das Programm über die Befehlszeile aus.
node index.js
Beachten Sie, dass der Pfad, der jetzt für die Dateien aufgeführt ist, der vollständige Systempfad ist, da die
__dirname
-Konstante den vollständigen Pfad zum aktuellen Speicherort zurückgibt.[ '/workspaces/node-essentials/nodejs-files/stores/201/sales.json', '/workspaces/node-essentials/nodejs-files/stores/202/sales.json', '/workspaces/node-essentials/nodejs-files/stores/203/sales.json', '/workspaces/node-essentials/nodejs-files/stores/204/sales.json' ]
Verknüpfen von Pfaden
Anstatt Ordnernamen zu verketten, um einen neuen Pfad für die Suche zu erstellen, ändern Sie den Code so, dass die path.join
-Methode verwendet wird. Dadurch kann dieser Code unabhängig vom Betriebssystem verwendet werden.
Ändern Sie die Methode
findFiles
so, dasspath.join
verwendet wird.// previous code - with string concatentation const resultsReturned = await findSalesFiles(`${folderName}/${item.name}`); // current code - with path.join const resultsReturned = await findSalesFiles(path.join(folderName,item.name));
Führen Sie das Programm über die Befehlszeile aus.
node index.js
Die Ausgabe ist identisch mit der des vorherigen Schritts. Das Programm ist nun jedoch stabiler, da
path.join
verwendet wird, anstatt Zeichenfolge miteinander zu verketten.
Suche nach allen JSON-Dateien
Anstatt nur nach sales.json-Dateien zu suchen, soll dieses Programm nach allen Dateien mit der JSON-Erweiterung suchen. Verwenden Sie dazu die path.extname
-Methode, um die Dateierweiterung zu überprüfen.
Führen Sie den folgenden Befehl im Terminal aus, um die Datei stores/201/sales.json in stores/sales/totals.json umzubenennen.
mv stores/201/sales.json stores/201/totals.json
Ändern Sie in der
findSalesFiles
-Funktion dieif
-Anweisung so, dass nur die Dateinamenerweiterung überprüft wird.if (path.extname(item.name) === ".json") { results.push(`${folderName}/${item.name}`); }
Führen Sie das Programm über die Befehlszeile aus.
node index.js
Die Ausgabe zeigt nun alle JSON-Dateien, die sich in einem der nach Filial-ID aufgeteilten Verzeichnisse befinden.
[ '/home/username/node-essentials/nodejs-files/stores/201/totals.json', '/home/username/node-essentials/nodejs-files/stores/202/sales.json', '/home/username/node-essentials/nodejs-files/stores/203/sales.json', '/home/username/node-essentials/nodejs-files/stores/204/sales.json' ]
Gut gemacht! Sie haben das path-Modul und die Konstante __dirname
verwendet, um das Programm deutlich stabiler zu gestalten. Im nächsten Abschnitt erfahren Sie, wie Sie Verzeichnisse erstellen und Dateien zwischen Speicherorten verschieben.
Wissen Sie nicht weiter?
Wenn Sie während dieser Übung Probleme hatten, finden Sie hier den vervollständigten Code. Ersetzen Sie alle Inhalte der index.js-Datei durch diese Lösung.
const fs = require("fs").promises;
const path = require("path");
async function findSalesFiles(folderName) {
// (1) Add an array at the top, to hold the paths to all the sales files that the program finds.
let results = [];
// (2) Read the currentFolder with the `readdir` method.
const items = await fs.readdir(folderName, { withFileTypes: true });
// (3) Add a block to loop over each item returned from the `readdir` method using the asynchronous `for...of` loop.
for (const item of items) {
// (4) Add an `if` statement to determine if the item is a file or a directory.
if (item.isDirectory()) {
// (5) If the item is a directory, recursively call the function `findSalesFiles` again, passing in the path to the item.
const resultsReturned = await findSalesFiles(path.join(folderName, item.name));
results = results.concat(resultsReturned);
} else {
// (6) If it's not a directory, add a check to make sure the item name matches *sales.json*.
if (path.extname(item.name) === ".json")
results.push(`${folderName}/${item.name}`);
}
}
return results;
}
async function main() {
const salesDir = path.join(__dirname, "stores");
// find paths to all the sales files
const salesFiles = await findSalesFiles(salesDir);
console.log(salesFiles);
}
main();