Cvičení – práce s cestami

Dokončeno

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.

  1. 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);
    }
    
  2. 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.

  1. Změňte metodu findFiles, aby používala path.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));
    
  2. 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.

  1. 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
    
  2. findSalesFiles Ve funkci změňte if příkaz tak, aby zkontroloval pouze příponu názvu souboru.

    if (path.extname(item.name) === ".json") {
      results.push(`${folderName}/${item.name}`);
    }
    
  3. 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();