Hay una carpeta con varios archivos JSON que están en el mismo formato JSON. Cada archivo contiene la siguiente información: nombre, apellido, cumpleaños, dirección y número de teléfono. Su tarea es leer todos los archivos y analizar los datos en el mismo objeto de persona. La tarea es enumerar todos los datos en cualquier formato de salida que elija, que también puede ser una consola.
Este es mi código en NodeJs
import {readdir, readFile} from "fs"; const dir = "./src/json"; const dirAccess = readdir(`${dir}`, (err, files) => { files.forEach((file) => { const read = readFile(`${dir}/${file}`, "utf8", (err, data) => { let p = JSON.parse(data); console.log(p); }); }); });
Tengo mis datos en 'p', ahora mi pregunta es ¿Cómo puedo poner todos los datos JSON analizados en el mismo objeto de persona?
Cree un objeto JSON fuera de la función forEach y concatene todo el JSON en ese único objeto.
let jsonconcat = {}; //then in the loop you do jsonconcat = {...jsonconcat, p}
Luego puede guardarlo como un archivo o lo que quiera hacer con el objeto JSON.
Así que debería verse como:
import {readdir, readFile} from "fs"; const dir = "./src/json"; let jsonconcat = {}; const dirAccess = readdir(`${dir}`, (err, files) => { files.forEach((file) => { const read = readFile(`${dir}/${file}`, "utf8", (err, data) => { let p = JSON.parse(data); jsonconcat = {...jsonconcat, p} console.log(p); }); }); });
Encontré la respuesta aquí:
El retorno de la función JavaScript está vacío después de leer el archivo
¿Cómo hacer que fs.readFile async espere?
readdir y readFile son asíncronos, por lo que debe dejar que el código espere a que se complete el proceso.
import fs, { readdir, readFile } from 'fs'; import path from 'path'; const dir = './src/json'; let jsonData = []; async function readingDirectory(directory) { const fileNames = await fs.promises.readdir(directory); for (let file of fileNames) { const absolutePath = path.join(directory, file); const data = await fs.promises.readFile(absolutePath); let p = JSON.parse(data); console.log(absolutePath, p); jsonData.push(p); } } readingDirectory(dir) .then(() => { console.log(jsonData); }) .catch((err) => { console.log(err); });