Latihan - Bekerja dengan jalur

Selesai

Sebagai pengembang di Tailwind Traders, Anda akan meningkatkan program dengan menggunakan modul jalur Node.js dan __dirname variabel global. Ini akan memungkinkan program untuk secara dinamis menemukan dan memproses file .json apa pun, terlepas dari mana program dijalankan.

Sertakan modul jalur

Di bagian atas file index.js yang ada, sertakan modul jalur.

const path = require("path");

Gunakan direktori saat ini

Dalam kode index.js saat ini, Anda meneruskan lokasi statis folder stores. Mari kita ubah kode tersebut __dirname untuk menggunakan nilai alih-alih meneruskan nama folder statis.

  1. Dalam metode main, buat variabel untuk menyimpan jalur ke direktori stores dengan menggunakan konstanta __dirname.

    async function main() {
      const salesDir = path.join(__dirname, "stores");
    
      const salesFiles = await findSalesFiles(salesDir);
      console.log(salesFiles);
    }
    
  2. Jalankan program dari baris perintah.

    node index.js
    

    Perhatikan bahwa jalur yang sekarang tercantum untuk file adalah jalur sistem lengkap, karena __dirname konstanta mengembalikan jalur lengkap ke lokasi saat ini.

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

Gabung jalur

Alih-alih menggabungkan nama folder untuk membuat jalur baru untuk dicari, Anda mengubah kode untuk menggunakan metode .path.join Kode ini kemudian dapat berfungsi di seluruh sistem operasi.

  1. Ubah metode findFiles untuk menggunakan 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. Jalankan program dari baris perintah.

    node index.js
    

    Outputnya sama dengan langkah sebelumnya, tetapi program sekarang lebih kuat karena menggunakan path.join alih-alih menggabungkan string.

Menemukan semua file .json

Alih-alih hanya mencari file sales.json, program perlu mencari file apa pun dengan ekstensi .json. Untuk melakukannya, gunakan metode path.extname untuk memeriksa ekstensi nama file.

  1. Jalankan perintah berikut di terminal untuk mengganti nama file stores/201/sales.json menjadi stores/sales/totals.json.

    mv stores/201/sales.json stores/201/totals.json
    
  2. findSalesFiles Dalam fungsi , ubah if pernyataan untuk memeriksa ekstensi nama file saja.

    if (path.extname(item.name) === ".json") {
      results.push(`${folderName}/${item.name}`);
    }
    
  3. Jalankan program dari baris perintah.

    node index.js
    

    Output sekarang menampilkan semua file .json di salah satu direktori ID toko.

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

Kerja bagus! Anda telah menggunakan modul path dan konstanta __dirname untuk membuat program lebih tangguh. Di bagian berikutnya, Anda akan mempelajari cara membuat direktori dan memindahkan file antar lokasi.

Macet?

Jika Anda terjebak pada titik apa pun dalam latihan ini, berikut adalah kode yang telah selesai. Hapus semua yang ada di index.js dan ganti dengan solusi ini.

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