Esercizio - Operare sui percorsi
Gli sviluppatori di Tailwind Traders stanno per migliorare un programma usando il modulo path Node.js e __dirname
la variabile globale. In questo modo il programma potrà individuare ed elaborare dinamicamente tutti i file JSON, indipendentemente dalla posizione da cui viene eseguito il programma.
Includere il modulo path
Nella parte superiore del file index.js esistente includere il modulo path.
const path = require("path");
Usare la directory corrente
Nel codice index.js corrente viene passato il percorso statico della cartella stores. Il codice verrà cambiato in modo da usare il valore __dirname
anziché passare un nome di cartella statico.
Nel metodo
main
creare una variabile per archiviare il percorso della directory stores usando la costante__dirname
.async function main() { const salesDir = path.join(__dirname, "stores"); const salesFiles = await findSalesFiles(salesDir); console.log(salesFiles); }
Eseguire il programma dalla riga di comando.
node index.js
Si noti che il percorso ora elencato per i file è il percorso di sistema completo, perché la costante
__dirname
restituisce il percorso completo della posizione corrente.[ '/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' ]
Unire i percorsi
Invece di concatenare i nomi di cartella per creare un nuovo percorso di ricerca, il codice verrà cambiato per usare il metodo path.join
. Questo codice può quindi funzionare in vari sistemi operativi.
Modificare il metodo
findFiles
per usarepath.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));
Eseguire il programma dalla riga di comando.
node index.js
L'output è identico a quello del passaggio precedente, ma il programma è ora più efficace perché usa
path.join
invece di concatenare le stringhe.
Trovare tutti i file con estensione json
Anziché cercare solo i file sales.json, questo programma deve cercare qualsiasi file con estensione json. A tale scopo, usare il metodo path.extname
per controllare l'estensione del nome file.
Eseguire il comando seguente nel terminale per rinominare il file stores/201/sales.json in stores/sales/totals.json.
mv stores/201/sales.json stores/201/totals.json
findSalesFiles
Nella funzione modificare l'istruzioneif
per controllare solo l'estensione del nome file.if (path.extname(item.name) === ".json") { results.push(`${folderName}/${item.name}`); }
Eseguire il programma dalla riga di comando.
node index.js
L'output mostra ora tutti i file json presenti in una delle directory degli ID dei negozi.
[ '/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' ]
Fantastico! si è visto come usare path e la costante __dirname
per rendere il programma molto più efficace. Nella prossima sezione si apprenderà come creare directory e spostare file tra i percorsi.
Se si riscontrano problemi
In caso di difficoltà a seguire l'esercizio in qualsiasi punto, di seguito è riportato il codice completo. Rimuovere tutto il contenuto del file index.js e sostituirlo con questa soluzione.
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();