Esercizio - Operare sui percorsi

Completato

Gli sviluppatori di Tailwind Traders stanno per migliorare un programma usando il modulo path Node.js e __dirname la variabile globale. In questo modo il programma potrà individuare ed elaborare dinamicamente tutti i file JSON, indipendentemente dalla posizione da cui viene eseguito il programma.

Includere il modulo path

Nella parte superiore del file index.js esistente includere il modulo path.

const path = require("path");

Usare la directory corrente

Nel codice index.js corrente viene passato il percorso statico della cartella stores. Il codice verrà cambiato in modo da usare il valore __dirname anziché passare un nome di cartella statico.

  1. Nel metodo main creare una variabile per archiviare il percorso della directory stores usando la costante __dirname.

    async function main() {
      const salesDir = path.join(__dirname, "stores");
    
      const salesFiles = await findSalesFiles(salesDir);
      console.log(salesFiles);
    }
    
  2. Eseguire il programma dalla riga di comando.

    node index.js
    

    Si noti che il percorso ora elencato per i file è il percorso di sistema completo, perché la costante __dirname restituisce il percorso completo della posizione corrente.

    [
       '/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'
    ]
    

Unire i percorsi

Invece di concatenare i nomi di cartella per creare un nuovo percorso di ricerca, il codice verrà cambiato per usare il metodo path.join. Questo codice può quindi funzionare in vari sistemi operativi.

  1. Modificare il metodo findFiles per usare 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. Eseguire il programma dalla riga di comando.

    node index.js
    

    L'output è identico a quello del passaggio precedente, ma il programma è ora più efficace perché usa path.join invece di concatenare le stringhe.

Trovare tutti i file con estensione json

Anziché cercare solo i file sales.json, questo programma deve cercare qualsiasi file con estensione json. A tale scopo, usare il metodo path.extname per controllare l'estensione del nome file.

  1. Eseguire il comando seguente nel terminale per rinominare il file stores/201/sales.json in stores/sales/totals.json.

    mv stores/201/sales.json stores/201/totals.json
    
  2. findSalesFiles Nella funzione modificare l'istruzione if per controllare solo l'estensione del nome file.

    if (path.extname(item.name) === ".json") {
      results.push(`${folderName}/${item.name}`);
    }
    
  3. Eseguire il programma dalla riga di comando.

    node index.js
    

    L'output mostra ora tutti i file json presenti in una delle directory degli ID dei negozi.

    [
       '/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'
    ]
    

Fantastico! si è visto come usare path e la costante __dirname per rendere il programma molto più efficace. Nella prossima sezione si apprenderà come creare directory e spostare file tra i percorsi.

Se si riscontrano problemi

In caso di difficoltà a seguire l'esercizio in qualsiasi punto, di seguito è riportato il codice completo. Rimuovere tutto il contenuto del file index.js e sostituirlo con questa soluzione.

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();