Exercício – trabalhar com caminhos
Como desenvolvedor da Tailwind Traders, você está prestes a aprimorar um programa usando o módulo de path Node.js e a variável global __dirname
. Isso permitirá que o programa localize e processe dinamicamente quaisquer arquivos .json, independentemente de onde o programa é executado.
Incluir o módulo path
Na parte superior do arquivo index.js, inclua o módulo path.
const path = require("path");
Usar o diretório atual
No código index.js atual, você está passando a localização estática da pasta stores. Vamos alterar esse código para usar o valor __dirname
em vez de passar um nome de pasta estática.
No método
main
, crie uma variável para armazenar um caminho para o diretório stores, usando a constante__dirname
.async function main() { const salesDir = path.join(__dirname, "stores"); const salesFiles = await findSalesFiles(salesDir); console.log(salesFiles); }
Execute o programa na linha de comando.
node index.js
Observe que o caminho que agora está listado para os arquivos é o caminho completo do sistema, pois a constante
__dirname
retorna o caminho completo para o local atual.[ '/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' ]
Caminhos de junção
Em vez de concatenar nomes de pastas para criar um caminho para pesquisa, você vai alterar o código para usar o método path.join
. Esse código pode funcionar em todos os sistemas operacionais.
Altere o método
findFiles
para usarpath.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));
Execute o programa na linha de comando.
node index.js
A saída é a mesma que a etapa anterior, mas o programa agora é mais robusto porque usa
path.join
em vez de concatenar cadeias de caracteres.
Localizar todos os arquivos .json
Em vez de procurar apenas arquivos sales.json, esse programa precisa pesquisar por qualquer arquivo com uma extensão .json. Para fazer isso, use o método path.extname
para verificar a extensão de nome de arquivo.
Execute o comando a seguir no terminal para renomear o arquivo stores/201/sales.json como stores/sales/totals.json.
mv stores/201/sales.json stores/201/totals.json
Na função
findSalesFiles
, altere a instruçãoif
para verificar apenas a extensão do nome de arquivo.if (path.extname(item.name) === ".json") { results.push(`${folderName}/${item.name}`); }
Execute o programa na linha de comando.
node index.js
A saída agora mostra todos os arquivos .json que estão em qualquer um dos diretórios de ID de loja.
[ '/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' ]
Bom trabalho! Você usou o módulo path e a constante __dirname
para tornar o programa muito mais robusto. Na próxima seção, você aprenderá a criar diretórios e a mover arquivos entre locais.
Ficou preso?
Se você ficou preso em algum ponto deste exercício, veja o código concluído. Remova tudo em index.js e substitua por essa solução.
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();