Ejercicio: Lectura de archivos y escritura en ellos

Completado

Ya casi hemos terminado de crear una aplicación Node.js maravillosa para Tailwind Traders. Hasta ahora, el código lee cualquier carpeta, busca todos los archivos .json y crea un archivo totals.txt en la carpeta salesTotals.

En este ejercicio, se completa el proyecto; para ello, se leen los archivos .json files, se suman los totales de todas las tiendas y se escribe el total general en el archivo salesTotals/totals.txt.

Creación de un método para calcular totales de ventas

  1. En la parte superior de index.js, justo debajo de la instrucción require("path"), cree una función que calcule el total de ventas. Este método debe tomar la matriz de rutas de acceso de archivo en la que pueda iterar.

    async function calculateSalesTotal(salesFiles) {
      let salesTotal = 0;
    
      // READ FILES LOOP
    
      return salesTotal;
    }
    
  2. Dentro de esa función, reemplace // READ FILES LOOP por un bucle que:

    • (1) Itere la matriz salesFiles.
    • (2) Lea el archivo.
    • (3) Analice el contenido como JSON.
    • (4) Incremente la variable salesTotal con el valor del archivo total.
     async function calculateSalesTotal(salesFiles) {
    
       // Final sales total
       let salesTotal = 0;
    
       // (1) Tterates over the `salesFiles` array.
       for (file of salesFiles) {
    
         // (2) Reads the file.
         const fileContents = await fs.readFile(file)
    
         // (3) Parses the content as JSON.
         const data = JSON.parse(fileContents);
    
         // (4) Increments the `salesTotal` variable with the `total` value from the file.
         salesTotal += data.total;
       }
       return salesTotal;
     }
    

Llamada al método calculateSalesTotals

  1. En la función main, modifique el código para:

    • (1) Agregar una llamada a la función calculateSalesTotals justo encima de la llamada a fs.writeFile.
    • (2) Modificar el bloque fs.writeFile para escribir el valor de la variable salesTotal en el archivo totals.txt.
    async function main() {
      const salesDir = path.join(__dirname, "stores");
      const salesTotalsDir = path.join(__dirname, "salesTotals");
    
      try {
        await fs.mkdir(salesTotalsDir);
      } catch {
        console.log(`${salesTotalsDir} already exists.`);
      }
    
      const salesFiles = await findSalesFiles(salesDir);
    
      // (1) Add a call to the `calculateSalesTotals` function just above the `fs.writeFile` call.
      const salesTotal = await calculateSalesTotal(salesFiles);
    
      // (2) Modify the `fs.writeFile` block to write the value of the `salesTotal` variable to the *totals.txt* file.
      await fs.writeFile(
        path.join(salesTotalsDir, "totals.txt"),
        `${salesTotal}\r\n`,
        { flag: "a" }
      );
    }
    

Ejecución del programa

  1. Ejecute el programa desde el terminal.

    node index.js
    
    185933.76
    
  2. Abra el archivo ./salesTotals/totals.txt para ver el total de todas las ventas de los archivos sales.json y totals.json: 185933.76.

  3. Vuelva a ejecutar el programa desde el terminal.

    node index.js
    
    185933.76
    185933.76
    

    El archivo totals.txt ahora tiene una segunda línea. Cada vez que el programa se ejecute, los totales se volverán a sumar y se escribirá una nueva línea en el archivo.

¡Gran trabajo! Hemos escrito una herramienta inteligente, eficaz y útil que Tailwind Traders puede usar para procesar todas las ventas de sus tiendas cada noche. En la siguiente sección, revisaremos la información que hemos obtenido y algunas sugerencias que deberemos recordar.

¿Se ha bloqueado?

Si se ha bloqueado durante este ejercicio, aquí tiene el código completo de este proyecto.

const fs = require("fs").promises;
const path = require("path");

async function calculateSalesTotal(salesFiles) {
  
  // Final sales total
  let salesTotal = 0;
  
  // (1) Tterates over the `salesFiles` array.
  for (file of salesFiles) {
    
    // (2) Reads the file.
    const fileContents = await fs.readFile(file)

    // (3) Parses the content as JSON.
    const data = JSON.parse(fileContents);

    // (4) Increments the `salesTotal` variable with the `total` value from the file.
    salesTotal += data.total;
  }
  return salesTotal;
}

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` function 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");
  const salesTotalsDir = path.join(__dirname, "salesTotals");

  // create the salesTotal directory if it doesn't exist
  try {
    await fs.mkdir(salesTotalsDir);
  } catch {
    console.log(`${salesTotalsDir} already exists.`);
  }

  // find paths to all the sales files
  const salesFiles = await findSalesFiles(salesDir);

  // read through each sales file to calculate the sales total
  const salesTotal = await calculateSalesTotal(salesFiles);

  // write the total to the "totals.json" file
  await fs.writeFile(
    path.join(salesTotalsDir, "totals.txt"),
    `${salesTotal}\r\n`,
    { flag: "a" }
  );
  console.log(`Wrote sales totals to ${salesTotalsDir}`);
}

main();

¡Enhorabuena! Ha leído los archivos, analizado el JSON y escrito el total en un archivo. Ha completado el proyecto

Limpiar contenedor de desarrollo

Después de completar el proyecto, puede que desee limpiar el entorno de desarrollo o devolverlo a su estado típico.

La eliminación del entorno de GitHub Codespaces garantiza que pueda maximizar la cantidad de derechos de horas gratuitas por núcleo que obtiene para su cuenta.

Importante

Para obtener más información sobre los derechos de la cuenta de GitHub, consulte Almacenamiento y horas de núcleo incluidas mensualmente en GitHub Codespaces.

  1. Inicie sesión en el panel de GitHub Codespaces (https://github.com/codespaces).

  2. Busque los codespaces en ejecución actualmente procedentes del repositorio de GitHub MicrosoftDocs/node-essentials.

    Screenshot of all the running codespaces including their status and templates.

  3. Abra el menú contextual delcodespace y seleccione Eliminar.

    Screenshot of the context menu for a single codespace with the delete option highlighted.