Exercice - Utiliser des chemins

Effectué

En tant que développeur chez Tailwind Traders, vous êtes sur le point d’améliorer un programme en utilisant le module path de Node.js et la variable globale __dirname. Le programme pourra ainsi localiser et traiter dynamiquement tous les fichiers .json, quel que soit l’endroit à partir duquel il est exécuté.

Inclure le module path

Tout en haut du fichier index.js existant, incluez le module path.

const path = require("path");

Utiliser le répertoire actif

Dans le code index.js actuel, vous passez l’emplacement statique du dossier stores. Nous allons modifier ce code pour utiliser la valeur __dirname au lieu de passer un nom de dossier statique.

  1. Dans la méthode main, créez une variable pour stocker un chemin du répertoire stores en utilisant la constante __dirname.

    async function main() {
      const salesDir = path.join(__dirname, "stores");
    
      const salesFiles = await findSalesFiles(salesDir);
      console.log(salesFiles);
    }
    
  2. Exécutez le programme à partir de la ligne de commande.

    node index.js
    

    Notez que le chemin d’accès qui est maintenant répertorié pour les fichiers est le chemin d’accès système complet, car la constante __dirname retourne le chemin d’accès complet à l’emplacement actuel.

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

Chemins de jointure

Au lieu de concaténer des noms de dossiers pour créer un nouveau chemin de recherche, modifiez le code afin d’utiliser la méthode path.join. Ce code pourra ainsi fonctionner sur tous les systèmes d’exploitation.

  1. Changez la méthode findFiles pour utiliser 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. Exécutez le programme à partir de la ligne de commande.

    node index.js
    

    La sortie sera la même qu’à l’étape précédente, mais le programme est maintenant plus robuste parce qu’il utilise path.join au lieu de concaténer des chaînes.

Rechercher tous les fichiers .json

Au lieu de juste rechercher les fichiers sales.json, le programme doit rechercher tous les fichiers avec l’extension .json. Vous devez utiliser la méthode path.extname pour vérifier l’extension de nom de fichier.

  1. Exécutez la commande suivante dans le terminal pour renommer le fichier stores/201/sales.json en stores/sales/totals.json.

    mv stores/201/sales.json stores/201/totals.json
    
  2. Dans la fonction findSalesFiles, changez l’instruction if pour vérifier uniquement l’extension de nom de fichier.

    if (path.extname(item.name) === ".json") {
      results.push(`${folderName}/${item.name}`);
    }
    
  3. Exécutez le programme à partir de la ligne de commande.

    node index.js
    

    La sortie affiche maintenant tous les fichiers .json qui se trouvent dans l’un des répertoires d’ID de magasin.

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

Félicitations ! Vous avez utilisé le module path et la constante __dirname pour rendre le programme plus robuste. Dans la section suivante, vous allez apprendre à créer des répertoires et à déplacer des fichiers entre différents emplacements.

Vous êtes bloqué ?

Si vous êtes bloqué quelque part dans cet exercice, voici le code complet. Supprimez tout le contenu de index.js et remplacez-le par cette solution.

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