练习 - 使用路径

已完成

作为 Tailwind Traders 的开发人员,你将使用 Node.js 的 path 模块和 __dirname 全局变量来增强程序。 这样,程序可以动态查找和处理任何 .json 文件,而不考虑从何处运行程序。

包含“path”模块

在现有 index.js 文件的最顶部,包含 path 模块

const path = require("path");

使用当前目录

在当前的 index.js 代码中,要传递“store”文件夹的静态位置。 我们将此代码更改为使用 __dirname 值,而不是传递静态文件夹名称。

  1. main 方法中,创建一个变量以使用 __dirname 常量来存储“stores”目录的路径。

    async function main() {
      const salesDir = path.join(__dirname, "stores");
    
      const salesFiles = await findSalesFiles(salesDir);
      console.log(salesFiles);
    }
    
  2. 从命令行运行程序。

    node index.js
    

    请注意,现在为文件列出的路径是完整的系统路径,因为 __dirname 常量返回当前位置的完整路径。

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

联接路径

将代码更改为使用 path.join 方法,而不是连接文件夹名称来创建用于搜索的新路径。 然后此代码可以在所有操作系统中工作。

  1. 更改 findFiles 方法以使用 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. 从命令行运行程序。

    node index.js
    

    输出与上一个步骤相同,但程序现在更可靠,因为它使用 path.join 而不是串联字符串。

查找所有 .json 文件

此程序需要搜索扩展名为“.json”的所有文件,而不是只查找 sales.json 文件。 为此,请使用 path.extname 方法检查文件扩展名。

  1. 在终端中运行以下命令,将“stores/201/sales.json”文件重命名为“stores/sales/totals.json”。

    mv stores/201/sales.json stores/201/totals.json
    
  2. findSalesFiles 函数中,更改 if 语句以仅检查文件扩展名。

    if (path.extname(item.name) === ".json") {
      results.push(`${folderName}/${item.name}`);
    }
    
  3. 从命令行运行程序。

    node index.js
    

    现在,输出内容显示在存储 ID 目录中的所有 .json 文件。

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

太棒了! 你已使用“path”模块和 __dirname 常量让程序变得更可靠。 在下一节中,你将了解如何创建目录和在不同位置之间移动文件。

遇到困难了?

如果在此练习中遇到任何问题,可参考下面的完整代码。 删除 index.js 中的所有内容,并将其替换为此解决方案。

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