Cómo leer archivos de forma asíncrona en el nodo js, aquí hay una función simple.
Hay muchas respuestas complicadas en Internet, ¿alguien está de acuerdo si esta es la más simple?
export default async function handler(req, res) { let data = await readFiles('data/companies/'); res.status(200).json(data); } // async file reader function readFiles(dirname) { return new Promise(function (resolve, reject) { let data = {} fs.readdir(dirname, async function(err, filenames) { filenames.forEach(function(filename) { fs.readFile(dirname + filename, 'utf-8', function(err, content) { if (err) { reject(err) } data[filename] = content; if (filenames.length === Object.keys(data).length) { resolve(data) } }); }); }); }) }Un poco más limpio y más fácil usando el soporte de promesa incorporado en fs.promises :
const fs = require('fs'); const fsp = fs.promises; const path = require('path'); // async file reader async function readFiles(dirname) { const data = {}; const files = await fsp.readdir(dirname); for (const filename of files) { const full = path.join(dirname, filename); const content = await fsp.readFile(full, {encoding: 'utf8'}); data[filename] = content; } return data; }O, si desea ejecutar sus operaciones de archivo en paralelo (al menos hasta el límite del grupo de subprocesos), puede obtener un rendimiento de extremo a extremo ligeramente más rápido como este:
// async file reader async function readFiles(dirname) { const data = {}; const files = await fsp.readdir(dirname); await Promise.all(files.map(async filename => { const full = path.join(dirname, filename); const content = await fsp.readFile(full, {encoding: 'utf8'}); data[filename] = content; })); return data; }También esto:
res.status(200).json(data);se puede reemplazar con:
res.json(data);200 ya es el estado predeterminado, por lo que no hay razón para especificarlo.