Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

217
Vistas
Leyendo el archivo solo después de que la función haya terminado

Tengo una función doSmth que crea un archivo "data.json" al final. (el archivo SE crea al final de la ejecución del script). Sin embargo, cuando intento fs.readFileSync usando await y luego, dice

 Error: ENOENT: no such file or directory, open 'data.json'

aquí está mi código

 const doSmth = async() => { await zip.forEach(async(relativePath: any, file: any) => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) } }) } await doSmth().then(async () => { const fs = require("fs"); console.log("reached") fs.readFileSync("data.json") })

¿Cómo espero a que se cree el archivo data.json antes de leerlo?

Editar: de los comentarios cambié mi código a esto y funciona

 const doSmth = async() => { await Promise.all(zip.forEach(async(relativePath: any, file: any) => { return new Promise(resolve => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }

pero ahora tengo una espera dentro y causa el mismo error de archivo de datos no encontrado

 const doSmth = async() => { await Promise.all(zip.forEach(async(relativePath: any, file: any) => { return new Promise(async resolve => { const eachFile = await zip.file(file.name).async("string") const jsonObject = JSON.parse(eachFile) const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

el problema es que no está escribiendo el archivo de forma sincrónica en su bloque catch

 const doSmth = async() => { await zip.forEach(async(relativePath: any, file: any) => { const fs = require("fs"); try { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) } catch (error) { console.log("file didnt exist") fs.writeFileSync('data.json', JSON.stringify("")); // Yes, writeFileSync does create a new file when the file is not exists // So even this catch is redundant, use fs.existsSync if you really need to know the file exists or not } }) }

o es posible que desee hacer una primisificación adecuada para cada cosa

about 4 years ago · Juan Pablo Isaza Denunciar

0

Está utilizando await, pero no está devolviendo promesas.

Usaremos Promise.all para esperar todas las promesas, y para cada archivo zip, devolveremos una new Promise cuando termine llamando a resolve()

 const doSmth = async() => { await Promise.all(zip.map(async(relativePath: any, file: any) => { return new Promise(resolve => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }

PD: No conté los paréntesis de cierre, edítelos en consecuencia.

PS2: su data.json debe estar vacío ya que está usando JSON.stringify("") que es una cadena vacía

si quieres hacer las cosas secuencialmente

 import fs from 'fs'; const fsPromises = fs.promises; const doSmth = async () => { return new Promise(async resolve => { for (let i = 0; i < zip.length; i++) { const file = zip[i]; if (await fsPromises.exists(file)) { await fsPromises.writeFile('data.json', file); } } resolve(); //End the function by returning a promise. }) }
about 4 years ago · Juan Pablo Isaza Denunciar

0

No mezcle ni combine async/await con then . Parece que quieres hacer algo como esto.

 const fs = require('fs'); async function main() { await doSmth(); console.log('reached'); fs.readFileSync('data.json'); } main();

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda