练习 - 使用路径
作为 Tailwind Traders 的开发人员,你将使用 Node.js 的 path 模块和 __dirname
全局变量来增强程序。 这样,程序可以动态查找和处理任何 .json 文件,而不考虑从何处运行程序。
包含“path”模块
在现有 index.js 文件的最顶部,包含 path 模块。
const path = require("path");
使用当前目录
在当前的 index.js 代码中,要传递“store”文件夹的静态位置。 我们将此代码更改为使用 __dirname
值,而不是传递静态文件夹名称。
在
main
方法中,创建一个变量以使用__dirname
常量来存储“stores”目录的路径。async function main() { const salesDir = path.join(__dirname, "stores"); const salesFiles = await findSalesFiles(salesDir); console.log(salesFiles); }
从命令行运行程序。
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
方法,而不是连接文件夹名称来创建用于搜索的新路径。 然后此代码可以在所有操作系统中工作。
更改
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));
从命令行运行程序。
node index.js
输出与上一个步骤相同,但程序现在更可靠,因为它使用
path.join
而不是串联字符串。
查找所有 .json 文件
此程序需要搜索扩展名为“.json”的所有文件,而不是只查找 sales.json 文件。 为此,请使用 path.extname
方法检查文件扩展名。
在终端中运行以下命令,将“stores/201/sales.json”文件重命名为“stores/sales/totals.json”。
mv stores/201/sales.json stores/201/totals.json
在
findSalesFiles
函数中,更改if
语句以仅检查文件扩展名。if (path.extname(item.name) === ".json") { results.push(`${folderName}/${item.name}`); }
从命令行运行程序。
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();