Cvičení – práce s cestami
Jako vývojář ve společnosti Tailwind Traders se chystáte program vylepšit pomocí modulu Path Node.js a __dirname
globální proměnné. Program tak bude moct dynamicky vyhledávat a zpracovávat všechny soubory .json bez ohledu na to, odkud se program spouští.
Zahrnutí modulu path
V horní části existujícího souboru index.js zahrňte modul cesty .
const path = require("path");
Použití aktuálního adresáře
V aktuálním kódu souboru index.js předáváte statické umístění složky stores. Pojďme tento kód změnit tak, aby místo předávání názvu statické složky používal __dirname
hodnotu.
V metodě
main
vytvořte proměnnou pro uložení cesty k adresáři stores s použitím konstanty__dirname
.async function main() { const salesDir = path.join(__dirname, "stores"); const salesFiles = await findSalesFiles(salesDir); console.log(salesFiles); }
Spusťte tento program z příkazového řádku.
node index.js
Všimněte si, že cesta, která je nyní uvedená pro soubory, je úplná systémová cesta, protože konstanta
__dirname
vrátí úplnou cestu k aktuálnímu umístění.[ '/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' ]
Spojovací cesty
Místo zřetězení názvů složek pro vytvoření nové cesty k hledání změníte kód tak, aby používal metodu path.join
. Tento kód pak může fungovat napříč operačními systémy.
Změňte metodu
findFiles
, aby používalapath.join
.// 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));
Spusťte tento program z příkazového řádku.
node index.js
Výstup je stejný jako předchozí krok, ale program je teď robustnější, protože místo zřetězení řetězců používá
path.join
.
Nalezení všech souborů .json
Místo toho, aby program hledal jen soubory sales.json, musí hledat libovolný soubor s příponou .json. K tomu použijte metodu path.extname
ke kontrole přípony názvu souboru.
Spuštěním následujícího příkazu v terminálu přejmenujte soubor stores/201/sales.json na stores/sales/totals.json.
mv stores/201/sales.json stores/201/totals.json
findSalesFiles
Ve funkci změňteif
příkaz tak, aby zkontroloval pouze příponu názvu souboru.if (path.extname(item.name) === ".json") { results.push(`${folderName}/${item.name}`); }
Spusťte tento program z příkazového řádku.
node index.js
Ve výstupu se teď zobrazují všechny soubory .json, které jsou ve všech adresářích s ID prodejny.
[ '/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' ]
Skvělá práce! Díky modulu path a konstantě __dirname
je program mnohem robustnější. V další části se dozvíte, jak vytvářet adresáře a přesouvat soubory mezi umístěními.
Zasekli jste se?
Pokud jste v jakémkoli bodě tohoto cvičení zasekli, zde najdete hotový kód. Odeberte veškerý kód v souboru index.js a nahraďte ho tímto řešením.
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();